[SCSI] bfa: Enhancement for fcpim and IO tag handling.
authorKrishna Gudipati <kgudipat@brocade.com>
Mon, 13 Jun 2011 22:53:58 +0000 (15:53 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 29 Jun 2011 20:54:23 +0000 (15:54 -0500)
- Enhancements to FCPIM module.
- Introduced IO tag management to allocate/release IOs to FCPIM module
  from a free IOtag pool.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfa_core.c
drivers/scsi/bfa/bfa_defs_svc.h
drivers/scsi/bfa/bfa_fcpim.c
drivers/scsi/bfa/bfa_fcpim.h
drivers/scsi/bfa/bfa_modules.h
drivers/scsi/bfa/bfi_ms.h

index 0dbdd2da5b480e5b88d07f5e3a12af15cfdcc425..6da615f48822daee870735ea31ad6d42cba9ee21 100644 (file)
@@ -31,7 +31,7 @@ static struct bfa_module_s *hal_mods[] = {
        &hal_mod_lps,
        &hal_mod_uf,
        &hal_mod_rport,
-       &hal_mod_fcpim,
+       &hal_mod_fcp,
        NULL
 };
 
@@ -51,7 +51,7 @@ static bfa_isr_func_t  bfa_isrs[BFI_MC_MAX] = {
        bfa_fcxp_isr,           /* BFI_MC_FCXP */
        bfa_lps_isr,            /* BFI_MC_LPS */
        bfa_rport_isr,          /* BFI_MC_RPORT */
-       bfa_itnim_isr,          /* BFI_MC_ITN */
+       bfa_itn_isr,            /* BFI_MC_ITN */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_READ */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_WRITE */
        bfa_isr_unhandled,      /* BFI_MC_IOIM_IO */
@@ -448,6 +448,8 @@ bfa_iocfc_send_cfg(void *bfa_arg)
         */
        cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG;
        cfg_info->num_cqs = cfg->fwcfg.num_cqs;
+       cfg_info->num_ioim_reqs = cpu_to_be16(cfg->fwcfg.num_ioim_reqs);
+       cfg_info->num_fwtio_reqs = cpu_to_be16(cfg->fwcfg.num_fwtio_reqs);
 
        bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa);
        /*
@@ -729,6 +731,7 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa)
 
        fwcfg->num_cqs        = fwcfg->num_cqs;
        fwcfg->num_ioim_reqs  = be16_to_cpu(fwcfg->num_ioim_reqs);
+       fwcfg->num_fwtio_reqs = be16_to_cpu(fwcfg->num_fwtio_reqs);
        fwcfg->num_tskim_reqs = be16_to_cpu(fwcfg->num_tskim_reqs);
        fwcfg->num_fcxp_reqs  = be16_to_cpu(fwcfg->num_fcxp_reqs);
        fwcfg->num_uf_bufs    = be16_to_cpu(fwcfg->num_uf_bufs);
@@ -1272,6 +1275,7 @@ bfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg)
        cfg->fwcfg.num_fcxp_reqs = DEF_CFG_NUM_FCXP_REQS;
        cfg->fwcfg.num_uf_bufs = DEF_CFG_NUM_UF_BUFS;
        cfg->fwcfg.num_cqs = DEF_CFG_NUM_CQS;
+       cfg->fwcfg.num_fwtio_reqs = 0;
 
        cfg->drvcfg.num_reqq_elems = DEF_CFG_NUM_REQQ_ELEMS;
        cfg->drvcfg.num_rspq_elems = DEF_CFG_NUM_RSPQ_ELEMS;
@@ -1293,6 +1297,7 @@ bfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg)
        cfg->fwcfg.num_fcxp_reqs   = BFA_FCXP_MIN;
        cfg->fwcfg.num_uf_bufs     = BFA_UF_MIN;
        cfg->fwcfg.num_rports      = BFA_RPORT_MIN;
+       cfg->fwcfg.num_fwtio_reqs = 0;
 
        cfg->drvcfg.num_sgpgs      = BFA_SGPG_MIN;
        cfg->drvcfg.num_reqq_elems = BFA_REQQ_NELEMS_MIN;
index 6934b2d8d857ade9ac8c86c64e20f5405fb6baf6..e1aae51bb9749e6b208820a942e18f65017cab22 100644 (file)
@@ -47,11 +47,12 @@ struct bfa_iocfc_fwcfg_s {
        u16        num_rports;  /*  number of remote ports      */
        u16        num_ioim_reqs;       /*  number of IO reqs           */
        u16        num_tskim_reqs;      /*  task management requests    */
+       u16        num_fwtio_reqs;      /* number of TM IO reqs in FW */
        u16        num_fcxp_reqs;       /*  unassisted FC exchanges     */
        u16        num_uf_bufs; /*  unsolicited recv buffers    */
        u8              num_cqs;
        u8              fw_tick_res;    /*  FW clock resolution in ms */
-       u8              rsvd[4];
+       u8              rsvd[2];
 };
 #pragma pack()
 
index 874cd79855eaa02c9048431e1d7884e670cbab26..76d9a00ffb6a7433e9438222c72bfee58888daf8 100644 (file)
@@ -19,7 +19,6 @@
 #include "bfa_modules.h"
 
 BFA_TRC_FILE(HAL, FCPIM);
-BFA_MODULE(fcpim);
 
 /*
  *  BFA ITNIM Related definitions
@@ -295,16 +294,9 @@ bfa_fcpim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len,
        /*
         * IO memory
         */
-       if (cfg->fwcfg.num_ioim_reqs < BFA_IOIM_MIN)
-               cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MIN;
-       else if (cfg->fwcfg.num_ioim_reqs > BFA_IOIM_MAX)
-               cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX;
-
        *km_len += cfg->fwcfg.num_ioim_reqs *
          (sizeof(struct bfa_ioim_s) + sizeof(struct bfa_ioim_sp_s));
 
-       *dm_len += cfg->fwcfg.num_ioim_reqs * BFI_IOIM_SNSLEN;
-
        /*
         * task management command memory
         */
@@ -315,19 +307,21 @@ bfa_fcpim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len,
 
 
 static void
-bfa_fcpim_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
-               struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev)
+bfa_fcpim_attach(struct bfa_fcp_mod_s *fcp, void *bfad,
+               struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
+               struct bfa_pcidev_s *pcidev)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = &fcp->fcpim;
+       struct bfa_s *bfa = fcp->bfa;
 
        bfa_trc(bfa, cfg->drvcfg.path_tov);
        bfa_trc(bfa, cfg->fwcfg.num_rports);
        bfa_trc(bfa, cfg->fwcfg.num_ioim_reqs);
        bfa_trc(bfa, cfg->fwcfg.num_tskim_reqs);
 
+       fcpim->fcp              = fcp;
        fcpim->bfa              = bfa;
        fcpim->num_itnims       = cfg->fwcfg.num_rports;
-       fcpim->num_ioim_reqs  = cfg->fwcfg.num_ioim_reqs;
        fcpim->num_tskim_reqs = cfg->fwcfg.num_tskim_reqs;
        fcpim->path_tov         = cfg->drvcfg.path_tov;
        fcpim->delay_comp       = cfg->drvcfg.delay_comp;
@@ -340,24 +334,9 @@ bfa_fcpim_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
 }
 
 static void
-bfa_fcpim_detach(struct bfa_s *bfa)
-{
-}
-
-static void
-bfa_fcpim_start(struct bfa_s *bfa)
-{
-}
-
-static void
-bfa_fcpim_stop(struct bfa_s *bfa)
+bfa_fcpim_iocdisable(struct bfa_fcp_mod_s *fcp)
 {
-}
-
-static void
-bfa_fcpim_iocdisable(struct bfa_s *bfa)
-{
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = &fcp->fcpim;
        struct bfa_itnim_s *itnim;
        struct list_head *qe, *qen;
 
@@ -370,7 +349,7 @@ bfa_fcpim_iocdisable(struct bfa_s *bfa)
 void
 bfa_fcpim_path_tov_set(struct bfa_s *bfa, u16 path_tov)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
 
        fcpim->path_tov = path_tov * 1000;
        if (fcpim->path_tov > BFA_FCPIM_PATHTOV_MAX)
@@ -380,7 +359,7 @@ bfa_fcpim_path_tov_set(struct bfa_s *bfa, u16 path_tov)
 u16
 bfa_fcpim_path_tov_get(struct bfa_s *bfa)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
 
        return fcpim->path_tov / 1000;
 }
@@ -388,7 +367,7 @@ bfa_fcpim_path_tov_get(struct bfa_s *bfa)
 u16
 bfa_fcpim_qdepth_get(struct bfa_s *bfa)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
 
        return fcpim->q_depth;
 }
@@ -1000,7 +979,7 @@ bfa_itnim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len,
 }
 
 void
-bfa_itnim_attach(struct bfa_fcpim_mod_s *fcpim, struct bfa_meminfo_s *minfo)
+bfa_itnim_attach(struct bfa_fcpim_s *fcpim, struct bfa_meminfo_s *minfo)
 {
        struct bfa_s    *bfa = fcpim->bfa;
        struct bfa_itnim_s *itnim;
@@ -1224,7 +1203,7 @@ bfa_itnim_iotov_delete(struct bfa_itnim_s *itnim)
 static void
 bfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(itnim->bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(itnim->bfa);
        fcpim->del_itn_stats.del_itn_iocomp_aborted +=
                itnim->stats.iocomp_aborted;
        fcpim->del_itn_stats.del_itn_iocomp_timedout +=
@@ -1250,7 +1229,7 @@ bfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim)
 void
 bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        union bfi_itn_i2h_msg_u msg;
        struct bfa_itnim_s *itnim;
 
@@ -1295,9 +1274,11 @@ bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 struct bfa_itnim_s *
 bfa_itnim_create(struct bfa_s *bfa, struct bfa_rport_s *rport, void *ditn)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfa_itnim_s *itnim;
 
+       bfa_itn_create(bfa, rport, bfa_itnim_isr);
+
        itnim = BFA_ITNIM_FROM_TAG(fcpim, rport->rport_tag);
        WARN_ON(itnim->rport != rport);
 
@@ -1991,7 +1972,8 @@ __bfa_cb_ioim_comp(void *cbarg, bfa_boolean_t complete)
                if ((m->scsi_status == SCSI_STATUS_CHECK_CONDITION) &&
                                        m->sns_len) {
                        sns_len = m->sns_len;
-                       snsinfo = ioim->iosp->snsinfo;
+                       snsinfo = BFA_SNSINFO_FROM_TAG(ioim->fcpim->fcp,
+                                               ioim->iotag);
                }
 
                /*
@@ -2360,46 +2342,31 @@ bfa_ioim_delayed_comp(struct bfa_ioim_s *ioim, bfa_boolean_t iotov)
  * Memory allocation and initialization.
  */
 void
-bfa_ioim_attach(struct bfa_fcpim_mod_s *fcpim, struct bfa_meminfo_s *minfo)
+bfa_ioim_attach(struct bfa_fcpim_s *fcpim, struct bfa_meminfo_s *minfo)
 {
        struct bfa_ioim_s               *ioim;
        struct bfa_ioim_sp_s    *iosp;
        u16             i;
-       u8                      *snsinfo;
-       u32             snsbufsz;
 
        /*
         * claim memory first
         */
        ioim = (struct bfa_ioim_s *) bfa_meminfo_kva(minfo);
        fcpim->ioim_arr = ioim;
-       bfa_meminfo_kva(minfo) = (u8 *) (ioim + fcpim->num_ioim_reqs);
+       bfa_meminfo_kva(minfo) = (u8 *) (ioim + fcpim->fcp->num_ioim_reqs);
 
        iosp = (struct bfa_ioim_sp_s *) bfa_meminfo_kva(minfo);
        fcpim->ioim_sp_arr = iosp;
-       bfa_meminfo_kva(minfo) = (u8 *) (iosp + fcpim->num_ioim_reqs);
-
-       /*
-        * Claim DMA memory for per IO sense data.
-        */
-       snsbufsz = fcpim->num_ioim_reqs * BFI_IOIM_SNSLEN;
-       fcpim->snsbase.pa  = bfa_meminfo_dma_phys(minfo);
-       bfa_meminfo_dma_phys(minfo) += snsbufsz;
-
-       fcpim->snsbase.kva = bfa_meminfo_dma_virt(minfo);
-       bfa_meminfo_dma_virt(minfo) += snsbufsz;
-       snsinfo = fcpim->snsbase.kva;
-       bfa_iocfc_set_snsbase(fcpim->bfa, fcpim->snsbase.pa);
+       bfa_meminfo_kva(minfo) = (u8 *) (iosp + fcpim->fcp->num_ioim_reqs);
 
        /*
         * Initialize ioim free queues
         */
-       INIT_LIST_HEAD(&fcpim->ioim_free_q);
        INIT_LIST_HEAD(&fcpim->ioim_resfree_q);
        INIT_LIST_HEAD(&fcpim->ioim_comp_q);
 
-       for (i = 0; i < fcpim->num_ioim_reqs;
-            i++, ioim++, iosp++, snsinfo += BFI_IOIM_SNSLEN) {
+       for (i = 0; i < fcpim->fcp->num_ioim_reqs;
+            i++, ioim++, iosp++) {
                /*
                 * initialize IOIM
                 */
@@ -2408,22 +2375,19 @@ bfa_ioim_attach(struct bfa_fcpim_mod_s *fcpim, struct bfa_meminfo_s *minfo)
                ioim->bfa     = fcpim->bfa;
                ioim->fcpim   = fcpim;
                ioim->iosp    = iosp;
-               iosp->snsinfo = snsinfo;
                INIT_LIST_HEAD(&ioim->sgpg_q);
                bfa_reqq_winit(&ioim->iosp->reqq_wait,
                                   bfa_ioim_qresume, ioim);
                bfa_sgpg_winit(&ioim->iosp->sgpg_wqe,
                                   bfa_ioim_sgpg_alloced, ioim);
                bfa_sm_set_state(ioim, bfa_ioim_sm_uninit);
-
-               list_add_tail(&ioim->qe, &fcpim->ioim_free_q);
        }
 }
 
 void
 bfa_ioim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m;
        struct bfa_ioim_s *ioim;
        u16     iotag;
@@ -2507,7 +2471,7 @@ bfa_ioim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 void
 bfa_ioim_good_comp_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m;
        struct bfa_ioim_s *ioim;
        u16     iotag;
@@ -2573,18 +2537,21 @@ struct bfa_ioim_s *
 bfa_ioim_alloc(struct bfa_s *bfa, struct bfad_ioim_s *dio,
                struct bfa_itnim_s *itnim, u16 nsges)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfa_ioim_s *ioim;
+       struct bfa_iotag_s *iotag = NULL;
 
        /*
         * alocate IOIM resource
         */
-       bfa_q_deq(&fcpim->ioim_free_q, &ioim);
-       if (!ioim) {
+       bfa_q_deq(&fcpim->fcp->iotag_ioim_free_q, &iotag);
+       if (!iotag) {
                bfa_stats(itnim, no_iotags);
                return NULL;
        }
 
+       ioim = BFA_IOIM_FROM_TAG(fcpim, iotag->tag);
+
        ioim->dio = dio;
        ioim->itnim = itnim;
        ioim->nsges = nsges;
@@ -2601,7 +2568,8 @@ bfa_ioim_alloc(struct bfa_s *bfa, struct bfad_ioim_s *dio,
 void
 bfa_ioim_free(struct bfa_ioim_s *ioim)
 {
-       struct bfa_fcpim_mod_s *fcpim = ioim->fcpim;
+       struct bfa_fcpim_s *fcpim = ioim->fcpim;
+       struct bfa_iotag_s *iotag;
 
        if (ioim->nsgpgs > 0)
                bfa_sgpg_mfree(ioim->bfa, &ioim->sgpg_q, ioim->nsgpgs);
@@ -2610,8 +2578,17 @@ bfa_ioim_free(struct bfa_ioim_s *ioim)
        fcpim->ios_active--;
 
        ioim->iotag &= BFA_IOIM_IOTAG_MASK;
+
+       WARN_ON(!(ioim->iotag <
+               (fcpim->fcp->num_ioim_reqs + fcpim->fcp->num_fwtio_reqs)));
+       iotag = BFA_IOTAG_FROM_TAG(fcpim->fcp, ioim->iotag);
+
+       if (ioim->iotag < fcpim->fcp->num_ioim_reqs)
+               list_add_tail(&iotag->qe, &fcpim->fcp->iotag_ioim_free_q);
+       else
+               list_add_tail(&iotag->qe, &fcpim->fcp->iotag_tio_free_q);
+
        list_del(&ioim->qe);
-       list_add_tail(&ioim->qe, &fcpim->ioim_free_q);
 }
 
 void
@@ -3129,7 +3106,7 @@ bfa_tskim_cleanup(struct bfa_tskim_s *tskim)
  * Memory allocation and initialization.
  */
 void
-bfa_tskim_attach(struct bfa_fcpim_mod_s *fcpim, struct bfa_meminfo_s *minfo)
+bfa_tskim_attach(struct bfa_fcpim_s *fcpim, struct bfa_meminfo_s *minfo)
 {
        struct bfa_tskim_s *tskim;
        u16     i;
@@ -3161,7 +3138,7 @@ bfa_tskim_attach(struct bfa_fcpim_mod_s *fcpim, struct bfa_meminfo_s *minfo)
 void
 bfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfi_tskim_rsp_s *rsp = (struct bfi_tskim_rsp_s *) m;
        struct bfa_tskim_s *tskim;
        u16     tsk_tag = be16_to_cpu(rsp->tsk_tag);
@@ -3188,7 +3165,7 @@ bfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
 struct bfa_tskim_s *
 bfa_tskim_alloc(struct bfa_s *bfa, struct bfad_tskim_s *dtsk)
 {
-       struct bfa_fcpim_mod_s *fcpim = BFA_FCPIM_MOD(bfa);
+       struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
        struct bfa_tskim_s *tskim;
 
        bfa_q_deq(&fcpim->tskim_free_q, &tskim);
@@ -3233,3 +3210,153 @@ bfa_tskim_start(struct bfa_tskim_s *tskim, struct bfa_itnim_s *itnim,
        list_add_tail(&tskim->qe, &itnim->tsk_q);
        bfa_sm_send_event(tskim, BFA_TSKIM_SM_START);
 }
+
+/* BFA FCP module - parent module for fcpim */
+
+BFA_MODULE(fcp);
+
+static void
+bfa_fcp_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len, u32 *dm_len)
+{
+       u16     num_io_req;
+
+       /*
+        * ZERO for num_ioim_reqs and num_fwtio_reqs is allowed config value.
+        * So if the values are non zero, adjust them appropriately.
+        */
+       if (cfg->fwcfg.num_ioim_reqs &&
+           cfg->fwcfg.num_ioim_reqs < BFA_IOIM_MIN)
+               cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MIN;
+       else if (cfg->fwcfg.num_ioim_reqs > BFA_IOIM_MAX)
+               cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX;
+
+       if (cfg->fwcfg.num_fwtio_reqs > BFA_FWTIO_MAX)
+               cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX;
+
+       num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs);
+       if (num_io_req > BFA_IO_MAX) {
+               if (cfg->fwcfg.num_ioim_reqs && cfg->fwcfg.num_fwtio_reqs) {
+                       cfg->fwcfg.num_ioim_reqs = BFA_IO_MAX/2;
+                       cfg->fwcfg.num_fwtio_reqs = BFA_IO_MAX/2;
+               } else if (cfg->fwcfg.num_fwtio_reqs)
+                       cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX;
+               else
+                       cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX;
+       }
+
+       bfa_fcpim_meminfo(cfg, km_len, dm_len);
+
+       num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs);
+       *km_len += num_io_req * sizeof(struct bfa_iotag_s);
+       *km_len += cfg->fwcfg.num_rports * sizeof(struct bfa_itn_s);
+       *dm_len += num_io_req * BFI_IOIM_SNSLEN;
+}
+
+static void
+bfa_fcp_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
+               struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev)
+{
+       struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
+       u32     snsbufsz;
+
+       fcp->num_ioim_reqs = cfg->fwcfg.num_ioim_reqs;
+       fcp->num_fwtio_reqs  = cfg->fwcfg.num_fwtio_reqs;
+       fcp->num_itns   = cfg->fwcfg.num_rports;
+       fcp->bfa = bfa;
+
+       snsbufsz = (fcp->num_ioim_reqs + fcp->num_fwtio_reqs) * BFI_IOIM_SNSLEN;
+       fcp->snsbase.pa = bfa_meminfo_dma_phys(meminfo);
+       bfa_meminfo_dma_phys(meminfo) += snsbufsz;
+
+       fcp->snsbase.kva = bfa_meminfo_dma_virt(meminfo);
+       bfa_meminfo_dma_virt(meminfo) += snsbufsz;
+       bfa_iocfc_set_snsbase(bfa, fcp->snsbase.pa);
+
+       bfa_fcpim_attach(fcp, bfad, cfg, meminfo, pcidev);
+
+       fcp->itn_arr = (struct bfa_itn_s *) bfa_meminfo_kva(meminfo);
+       bfa_meminfo_kva(meminfo) = (u8 *)fcp->itn_arr +
+                       (fcp->num_itns * sizeof(struct bfa_itn_s));
+       memset(fcp->itn_arr, 0,
+                       (fcp->num_itns * sizeof(struct bfa_itn_s)));
+
+       bfa_iotag_attach(fcp, meminfo);
+}
+
+static void
+bfa_fcp_detach(struct bfa_s *bfa)
+{
+}
+
+static void
+bfa_fcp_start(struct bfa_s *bfa)
+{
+}
+
+static void
+bfa_fcp_stop(struct bfa_s *bfa)
+{
+}
+
+static void
+bfa_fcp_iocdisable(struct bfa_s *bfa)
+{
+       struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
+
+       bfa_fcpim_iocdisable(fcp);
+}
+
+void
+bfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport,
+               void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m))
+{
+       struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
+       struct bfa_itn_s *itn;
+
+       itn =  BFA_ITN_FROM_TAG(fcp, rport->rport_tag);
+       itn->isr = isr;
+}
+
+/*
+ * Itn interrupt processing.
+ */
+void
+bfa_itn_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
+{
+       struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa);
+       union bfi_itn_i2h_msg_u msg;
+       struct bfa_itn_s *itn;
+
+       msg.msg = m;
+       itn =  BFA_ITN_FROM_TAG(fcp, msg.create_rsp->bfa_handle);
+
+       if (itn->isr)
+               itn->isr(bfa, m);
+       else
+               WARN_ON(1);
+}
+
+void
+bfa_iotag_attach(struct bfa_fcp_mod_s *fcp, struct bfa_meminfo_s *minfo)
+{
+       struct bfa_iotag_s *iotag;
+       u16     num_io_req, i;
+
+       iotag = (struct bfa_iotag_s *) bfa_meminfo_kva(minfo);
+       fcp->iotag_arr = iotag;
+
+       INIT_LIST_HEAD(&fcp->iotag_ioim_free_q);
+       INIT_LIST_HEAD(&fcp->iotag_tio_free_q);
+
+       num_io_req = fcp->num_ioim_reqs + fcp->num_fwtio_reqs;
+       for (i = 0; i < num_io_req; i++, iotag++) {
+               memset(iotag, 0, sizeof(struct bfa_iotag_s));
+               iotag->tag = i;
+               if (i < fcp->num_ioim_reqs)
+                       list_add_tail(&iotag->qe, &fcp->iotag_ioim_free_q);
+               else
+                       list_add_tail(&iotag->qe, &fcp->iotag_tio_free_q);
+       }
+
+       bfa_meminfo_kva(minfo) = (u8 *) iotag;
+}
index 1e38dade842341731e3a137c1ee9a02e79c9a1ec..e1e3221fda43fbc760dc5c37bb887eca89e24fe7 100644 (file)
 #include "bfa_defs_svc.h"
 #include "bfa_cs.h"
 
+/* FCP module related definitions */
+#define BFA_IO_MAX     2000
+#define BFA_FWTIO_MAX  0
+
+struct bfa_fcp_mod_s;
+struct bfa_iotag_s {
+       struct list_head        qe;     /* queue element        */
+       u16     tag;                    /* FW IO tag            */
+};
+
+struct bfa_itn_s {
+       bfa_isr_func_t isr;
+};
+
+void bfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport,
+               void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m));
+void bfa_itn_isr(struct bfa_s *bfa, struct bfi_msg_s *m);
+void bfa_iotag_attach(struct bfa_fcp_mod_s *fcp, struct bfa_meminfo_s *minfo);
+
+#define BFA_FCP_MOD(_hal)      (&(_hal)->modules.fcp_mod)
+#define BFA_IOTAG_FROM_TAG(_fcp, _tag) \
+       (&(_fcp)->iotag_arr[(_tag & BFA_IOIM_IOTAG_MASK)])
+#define BFA_ITN_FROM_TAG(_fcp, _tag)   \
+       ((_fcp)->itn_arr + ((_tag) & ((_fcp)->num_itns - 1)))
+#define BFA_SNSINFO_FROM_TAG(_fcp, _tag) \
+       (((u8 *)(_fcp)->snsbase.kva) + (_tag * BFI_IOIM_SNSLEN))
 
 #define BFA_ITNIM_MIN   32
 #define BFA_ITNIM_MAX   1024
@@ -75,22 +101,20 @@ struct bfad_tskim_s;
 
 typedef void    (*bfa_fcpim_profile_t) (struct bfa_ioim_s *ioim);
 
-struct bfa_fcpim_mod_s {
+struct bfa_fcpim_s {
        struct bfa_s            *bfa;
+       struct bfa_fcp_mod_s    *fcp;
        struct bfa_itnim_s      *itnim_arr;
        struct bfa_ioim_s       *ioim_arr;
        struct bfa_ioim_sp_s    *ioim_sp_arr;
        struct bfa_tskim_s      *tskim_arr;
-       struct bfa_dma_s        snsbase;
        int                     num_itnims;
-       int                     num_ioim_reqs;
        int                     num_tskim_reqs;
        u32                     path_tov;
        u16                     q_depth;
        u8                      reqq;           /*  Request queue to be used */
        u8                      rsvd;
        struct list_head        itnim_q;        /*  queue of active itnim */
-       struct list_head        ioim_free_q;    /*  free IO resources   */
        struct list_head        ioim_resfree_q; /*  IOs waiting for f/w */
        struct list_head        ioim_comp_q;    /*  IO global comp Q    */
        struct list_head        tskim_free_q;
@@ -104,6 +128,19 @@ struct bfa_fcpim_mod_s {
        bfa_fcpim_profile_t     profile_start;
 };
 
+struct bfa_fcp_mod_s {
+       struct bfa_s            *bfa;
+       struct list_head        iotag_ioim_free_q;      /* free IO resources */
+       struct list_head        iotag_tio_free_q;       /* free IO resources */
+       struct bfa_iotag_s      *iotag_arr;
+       struct bfa_itn_s        *itn_arr;
+       int                     num_ioim_reqs;
+       int                     num_fwtio_reqs;
+       int                     num_itns;
+       struct bfa_dma_s        snsbase;
+       struct bfa_fcpim_s      fcpim;
+};
+
 /*
  * BFA IO (initiator mode)
  */
@@ -111,7 +148,7 @@ struct bfa_ioim_s {
        struct list_head        qe;             /*  queue elememt       */
        bfa_sm_t                sm;             /*  BFA ioim state machine */
        struct bfa_s            *bfa;           /*  BFA module  */
-       struct bfa_fcpim_mod_s  *fcpim;         /*  parent fcpim module */
+       struct bfa_fcpim_s      *fcpim;         /*  parent fcpim module */
        struct bfa_itnim_s      *itnim;         /*  i-t-n nexus for this IO  */
        struct bfad_ioim_s      *dio;           /*  driver IO handle    */
        u16                     iotag;          /*  FWI IO tag  */
@@ -129,7 +166,6 @@ struct bfa_ioim_s {
 
 struct bfa_ioim_sp_s {
        struct bfi_msg_s        comp_rspmsg;    /*  IO comp f/w response */
-       u8                      *snsinfo;       /*  sense info for this IO   */
        struct bfa_sgpg_wqe_s   sgpg_wqe;       /*  waitq elem for sgpg */
        struct bfa_reqq_wait_s  reqq_wait;      /*  to wait for room in reqq */
        bfa_boolean_t           abort_explicit; /*  aborted by OS       */
@@ -143,7 +179,7 @@ struct bfa_tskim_s {
        struct list_head        qe;
        bfa_sm_t                sm;
        struct bfa_s            *bfa;   /*  BFA module  */
-       struct bfa_fcpim_mod_s  *fcpim; /*  parent fcpim module */
+       struct bfa_fcpim_s      *fcpim; /*  parent fcpim module */
        struct bfa_itnim_s      *itnim; /*  i-t-n nexus for this IO  */
        struct bfad_tskim_s     *dtsk;  /*  driver task mgmt cmnd       */
        bfa_boolean_t           notify; /*  notify itnim on TM comp  */
@@ -182,13 +218,13 @@ struct bfa_itnim_s {
        struct bfa_wc_s wc;             /*  waiting counter     */
        struct bfa_timer_s timer;       /*  pending IO TOV       */
        struct bfa_reqq_wait_s reqq_wait; /*  to wait for room in reqq */
-       struct bfa_fcpim_mod_s *fcpim;  /*  fcpim module        */
+       struct bfa_fcpim_s *fcpim;      /*  fcpim module        */
        struct bfa_itnim_iostats_s      stats;
        struct bfa_itnim_ioprofile_s  ioprofile;
 };
 
 #define bfa_itnim_is_online(_itnim) ((_itnim)->is_online)
-#define BFA_FCPIM_MOD(_hal) (&(_hal)->modules.fcpim_mod)
+#define BFA_FCPIM(_hal)        (&(_hal)->modules.fcp_mod.fcpim)
 #define BFA_IOIM_TAG_2_ID(_iotag)      ((_iotag) & BFA_IOIM_IOTAG_MASK)
 #define BFA_IOIM_FROM_TAG(_fcpim, _iotag)      \
        (&fcpim->ioim_arr[(_iotag & BFA_IOIM_IOTAG_MASK)])
@@ -196,9 +232,9 @@ struct bfa_itnim_s {
        (&fcpim->tskim_arr[_tmtag & (fcpim->num_tskim_reqs - 1)])
 
 #define bfa_io_profile_start_time(_bfa)        \
-       (_bfa->modules.fcpim_mod.io_profile_start_time)
+       ((_bfa)->modules.fcp_mod.fcpim.io_profile_start_time)
 #define bfa_fcpim_get_io_profile(_bfa) \
-       (_bfa->modules.fcpim_mod.io_profile)
+       ((_bfa)->modules.fcp_mod.fcpim.io_profile)
 #define bfa_ioim_update_iotag(__ioim) do {                             \
        uint16_t k = (__ioim)->iotag >> BFA_IOIM_RETRY_TAG_OFFSET;      \
        k++; (__ioim)->iotag &= BFA_IOIM_IOTAG_MASK;                    \
@@ -217,7 +253,7 @@ bfa_ioim_maxretry_reached(struct bfa_ioim_s *ioim)
 /*
  * function prototypes
  */
-void   bfa_ioim_attach(struct bfa_fcpim_mod_s *fcpim,
+void   bfa_ioim_attach(struct bfa_fcpim_s *fcpim,
                                        struct bfa_meminfo_s *minfo);
 void   bfa_ioim_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 void   bfa_ioim_good_comp_isr(struct bfa_s *bfa,
@@ -228,7 +264,7 @@ void        bfa_ioim_cleanup_tm(struct bfa_ioim_s *ioim,
 void   bfa_ioim_iocdisable(struct bfa_ioim_s *ioim);
 void   bfa_ioim_tov(struct bfa_ioim_s *ioim);
 
-void   bfa_tskim_attach(struct bfa_fcpim_mod_s *fcpim,
+void   bfa_tskim_attach(struct bfa_fcpim_s *fcpim,
                                        struct bfa_meminfo_s *minfo);
 void   bfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 void   bfa_tskim_iodone(struct bfa_tskim_s *tskim);
@@ -237,9 +273,8 @@ void        bfa_tskim_cleanup(struct bfa_tskim_s *tskim);
 
 void   bfa_itnim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len,
                                        u32 *dm_len);
-void   bfa_itnim_attach(struct bfa_fcpim_mod_s *fcpim,
+void   bfa_itnim_attach(struct bfa_fcpim_s *fcpim,
                                        struct bfa_meminfo_s *minfo);
-void   bfa_itnim_detach(struct bfa_fcpim_mod_s *fcpim);
 void   bfa_itnim_iocdisable(struct bfa_itnim_s *itnim);
 void   bfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 void   bfa_itnim_iodone(struct bfa_itnim_s *itnim);
@@ -254,11 +289,11 @@ u16       bfa_fcpim_path_tov_get(struct bfa_s *bfa);
 u16    bfa_fcpim_qdepth_get(struct bfa_s *bfa);
 
 #define bfa_fcpim_ioredirect_enabled(__bfa)                            \
-       (((struct bfa_fcpim_mod_s *)(BFA_FCPIM_MOD(__bfa)))->ioredirect)
+       (((struct bfa_fcpim_s *)(BFA_FCPIM(__bfa)))->ioredirect)
 
 #define bfa_fcpim_get_next_reqq(__bfa, __qid)                          \
 {                                                                      \
-       struct bfa_fcpim_mod_s *__fcpim = BFA_FCPIM_MOD(__bfa);      \
+       struct bfa_fcpim_s *__fcpim = BFA_FCPIM(__bfa);      \
        __fcpim->reqq++;                                                \
        __fcpim->reqq &= (BFI_IOC_MAX_CQS - 1);      \
        *(__qid) = __fcpim->reqq;                                       \
index 4b67ea2ea4074d246fca3f808abf88a8eeffb8e4..0fc23f6450571692f0de9f02346293f57b112dcb 100644 (file)
@@ -34,7 +34,7 @@ struct bfa_modules_s {
        struct bfa_lps_mod_s    lps_mod;        /*  fcxp module       */
        struct bfa_uf_mod_s     uf_mod;         /*  unsolicited frame module */
        struct bfa_rport_mod_s  rport_mod;      /*  remote port module        */
-       struct bfa_fcpim_mod_s  fcpim_mod;      /*  FCP initiator module     */
+       struct bfa_fcp_mod_s    fcp_mod;        /*  FCP initiator module     */
        struct bfa_sgpg_mod_s   sgpg_mod;       /*  SG page module            */
        struct bfa_port_s       port;           /*  Physical port module     */
 };
@@ -51,7 +51,6 @@ enum {
        BFA_TRC_HAL_IOCFC_CB    = 5,
 };
 
-
 /*
  * Macro to define a new BFA module
  */
@@ -122,6 +121,6 @@ extern struct bfa_module_s hal_mod_fcxp;
 extern struct bfa_module_s hal_mod_lps;
 extern struct bfa_module_s hal_mod_uf;
 extern struct bfa_module_s hal_mod_rport;
-extern struct bfa_module_s hal_mod_fcpim;
+extern struct bfa_module_s hal_mod_fcp;
 
 #endif /* __BFA_MODULES_H__ */
index edb92561dde9ed5a5426f4d43e7a374994512d51..263631dcfa7cce2309e9e06f8224e8390c5acba9 100644 (file)
@@ -40,6 +40,9 @@ struct bfi_iocfc_cfg_s {
        u8       sense_buf_len; /*  SCSI sense length       */
        u16     rsvd_1;
        u32     endian_sig;     /*  endian signature of host     */
+       __be16  num_ioim_reqs;
+       __be16  num_fwtio_reqs;
+       u8      rsvd[4];
 
        /*
         * Request and response circular queue base addresses, size and