root/drivers/scsi/qla2xxx/qla_inline.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. qla24xx_calc_iocbs
  2. qla2x00_debounce_register
  3. qla2x00_poll
  4. host_to_fcp_swap
  5. host_to_adap
  6. qla2x00_clean_dsd_pool
  7. qla2x00_hba_err_chk_enabled
  8. qla2x00_reset_active
  9. qla2x00_chip_is_down
  10. qla2xxx_init_sp
  11. qla2xxx_get_qpair_sp
  12. qla2xxx_rel_qpair_sp
  13. qla2x00_get_sp
  14. qla2x00_rel_sp
  15. qla2x00_gid_list_size
  16. qla2x00_handle_mbx_completion
  17. qla2x00_set_retry_delay_timestamp
  18. qla_is_exch_offld_enabled
  19. qla_cpu_update
  20. qla_qpair_to_hint
  21. qla_83xx_start_iocbs

   1 /*
   2  * QLogic Fibre Channel HBA Driver
   3  * Copyright (c)  2003-2014 QLogic Corporation
   4  *
   5  * See LICENSE.qla2xxx for copyright and licensing details.
   6  */
   7 
   8 #include "qla_target.h"
   9 /**
  10  * qla24xx_calc_iocbs() - Determine number of Command Type 3 and
  11  * Continuation Type 1 IOCBs to allocate.
  12  *
  13  * @vha: HA context
  14  * @dsds: number of data segment decriptors needed
  15  *
  16  * Returns the number of IOCB entries needed to store @dsds.
  17  */
  18 static inline uint16_t
  19 qla24xx_calc_iocbs(scsi_qla_host_t *vha, uint16_t dsds)
  20 {
  21         uint16_t iocbs;
  22 
  23         iocbs = 1;
  24         if (dsds > 1) {
  25                 iocbs += (dsds - 1) / 5;
  26                 if ((dsds - 1) % 5)
  27                         iocbs++;
  28         }
  29         return iocbs;
  30 }
  31 
  32 /*
  33  * qla2x00_debounce_register
  34  *      Debounce register.
  35  *
  36  * Input:
  37  *      port = register address.
  38  *
  39  * Returns:
  40  *      register value.
  41  */
  42 static __inline__ uint16_t
  43 qla2x00_debounce_register(volatile uint16_t __iomem *addr)
  44 {
  45         volatile uint16_t first;
  46         volatile uint16_t second;
  47 
  48         do {
  49                 first = RD_REG_WORD(addr);
  50                 barrier();
  51                 cpu_relax();
  52                 second = RD_REG_WORD(addr);
  53         } while (first != second);
  54 
  55         return (first);
  56 }
  57 
  58 static inline void
  59 qla2x00_poll(struct rsp_que *rsp)
  60 {
  61         struct qla_hw_data *ha = rsp->hw;
  62 
  63         if (IS_P3P_TYPE(ha))
  64                 qla82xx_poll(0, rsp);
  65         else
  66                 ha->isp_ops->intr_handler(0, rsp);
  67 }
  68 
  69 static inline uint8_t *
  70 host_to_fcp_swap(uint8_t *fcp, uint32_t bsize)
  71 {
  72        uint32_t *ifcp = (uint32_t *) fcp;
  73        uint32_t *ofcp = (uint32_t *) fcp;
  74        uint32_t iter = bsize >> 2;
  75 
  76        for (; iter ; iter--)
  77                *ofcp++ = swab32(*ifcp++);
  78 
  79        return fcp;
  80 }
  81 
  82 static inline void
  83 host_to_adap(uint8_t *src, uint8_t *dst, uint32_t bsize)
  84 {
  85         uint32_t *isrc = (uint32_t *) src;
  86         __le32 *odest = (__le32 *) dst;
  87         uint32_t iter = bsize >> 2;
  88 
  89         for ( ; iter--; isrc++)
  90                 *odest++ = cpu_to_le32(*isrc);
  91 }
  92 
  93 static inline void
  94 qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx)
  95 {
  96         struct dsd_dma *dsd, *tdsd;
  97 
  98         /* clean up allocated prev pool */
  99         list_for_each_entry_safe(dsd, tdsd, &ctx->dsd_list, list) {
 100                 dma_pool_free(ha->dl_dma_pool, dsd->dsd_addr,
 101                     dsd->dsd_list_dma);
 102                 list_del(&dsd->list);
 103                 kfree(dsd);
 104         }
 105         INIT_LIST_HEAD(&ctx->dsd_list);
 106 }
 107 
 108 static inline int
 109 qla2x00_hba_err_chk_enabled(srb_t *sp)
 110 {
 111         /*
 112          * Uncomment when corresponding SCSI changes are done.
 113          *
 114         if (!sp->cmd->prot_chk)
 115                 return 0;
 116          *
 117          */
 118         switch (scsi_get_prot_op(GET_CMD_SP(sp))) {
 119         case SCSI_PROT_READ_STRIP:
 120         case SCSI_PROT_WRITE_INSERT:
 121                 if (ql2xenablehba_err_chk >= 1)
 122                         return 1;
 123                 break;
 124         case SCSI_PROT_READ_PASS:
 125         case SCSI_PROT_WRITE_PASS:
 126                 if (ql2xenablehba_err_chk >= 2)
 127                         return 1;
 128                 break;
 129         case SCSI_PROT_READ_INSERT:
 130         case SCSI_PROT_WRITE_STRIP:
 131                 return 1;
 132         }
 133         return 0;
 134 }
 135 
 136 static inline int
 137 qla2x00_reset_active(scsi_qla_host_t *vha)
 138 {
 139         scsi_qla_host_t *base_vha = pci_get_drvdata(vha->hw->pdev);
 140 
 141         /* Test appropriate base-vha and vha flags. */
 142         return test_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags) ||
 143             test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags) ||
 144             test_bit(ISP_ABORT_RETRY, &base_vha->dpc_flags) ||
 145             test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) ||
 146             test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
 147 }
 148 
 149 static inline int
 150 qla2x00_chip_is_down(scsi_qla_host_t *vha)
 151 {
 152         return (qla2x00_reset_active(vha) || !vha->hw->flags.fw_started);
 153 }
 154 
 155 static void qla2xxx_init_sp(srb_t *sp, scsi_qla_host_t *vha,
 156                             struct qla_qpair *qpair, fc_port_t *fcport)
 157 {
 158         memset(sp, 0, sizeof(*sp));
 159         sp->fcport = fcport;
 160         sp->iocbs = 1;
 161         sp->vha = vha;
 162         sp->qpair = qpair;
 163         sp->cmd_type = TYPE_SRB;
 164         INIT_LIST_HEAD(&sp->elem);
 165 }
 166 
 167 static inline srb_t *
 168 qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair,
 169     fc_port_t *fcport, gfp_t flag)
 170 {
 171         srb_t *sp = NULL;
 172         uint8_t bail;
 173 
 174         QLA_QPAIR_MARK_BUSY(qpair, bail);
 175         if (unlikely(bail))
 176                 return NULL;
 177 
 178         sp = mempool_alloc(qpair->srb_mempool, flag);
 179         if (sp)
 180                 qla2xxx_init_sp(sp, vha, qpair, fcport);
 181         else
 182                 QLA_QPAIR_MARK_NOT_BUSY(qpair);
 183         return sp;
 184 }
 185 
 186 static inline void
 187 qla2xxx_rel_qpair_sp(struct qla_qpair *qpair, srb_t *sp)
 188 {
 189         sp->qpair = NULL;
 190         mempool_free(sp, qpair->srb_mempool);
 191         QLA_QPAIR_MARK_NOT_BUSY(qpair);
 192 }
 193 
 194 static inline srb_t *
 195 qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, gfp_t flag)
 196 {
 197         srb_t *sp = NULL;
 198         uint8_t bail;
 199         struct qla_qpair *qpair;
 200 
 201         QLA_VHA_MARK_BUSY(vha, bail);
 202         if (unlikely(bail))
 203                 return NULL;
 204 
 205         qpair = vha->hw->base_qpair;
 206         sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, flag);
 207         if (!sp)
 208                 goto done;
 209 
 210         sp->vha = vha;
 211 done:
 212         if (!sp)
 213                 QLA_VHA_MARK_NOT_BUSY(vha);
 214         return sp;
 215 }
 216 
 217 static inline void
 218 qla2x00_rel_sp(srb_t *sp)
 219 {
 220         QLA_VHA_MARK_NOT_BUSY(sp->vha);
 221         qla2xxx_rel_qpair_sp(sp->qpair, sp);
 222 }
 223 
 224 static inline int
 225 qla2x00_gid_list_size(struct qla_hw_data *ha)
 226 {
 227         if (IS_QLAFX00(ha))
 228                 return sizeof(uint32_t) * 32;
 229         else
 230                 return sizeof(struct gid_list_info) * ha->max_fibre_devices;
 231 }
 232 
 233 static inline void
 234 qla2x00_handle_mbx_completion(struct qla_hw_data *ha, int status)
 235 {
 236         if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
 237             (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
 238                 set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
 239                 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
 240                 complete(&ha->mbx_intr_comp);
 241         }
 242 }
 243 
 244 static inline void
 245 qla2x00_set_retry_delay_timestamp(fc_port_t *fcport, uint16_t retry_delay)
 246 {
 247         if (retry_delay)
 248                 fcport->retry_delay_timestamp = jiffies +
 249                     (retry_delay * HZ / 10);
 250 }
 251 
 252 static inline bool
 253 qla_is_exch_offld_enabled(struct scsi_qla_host *vha)
 254 {
 255         if (qla_ini_mode_enabled(vha) &&
 256             (vha->ql2xiniexchg > FW_DEF_EXCHANGES_CNT))
 257                 return true;
 258         else if (qla_tgt_mode_enabled(vha) &&
 259             (vha->ql2xexchoffld > FW_DEF_EXCHANGES_CNT))
 260                 return true;
 261         else if (qla_dual_mode_enabled(vha) &&
 262             ((vha->ql2xiniexchg + vha->ql2xexchoffld) > FW_DEF_EXCHANGES_CNT))
 263                 return true;
 264         else
 265                 return false;
 266 }
 267 
 268 static inline void
 269 qla_cpu_update(struct qla_qpair *qpair, uint16_t cpuid)
 270 {
 271         qpair->cpuid = cpuid;
 272 
 273         if (!list_empty(&qpair->hints_list)) {
 274                 struct qla_qpair_hint *h;
 275 
 276                 list_for_each_entry(h, &qpair->hints_list, hint_elem)
 277                         h->cpuid = qpair->cpuid;
 278         }
 279 }
 280 
 281 static inline struct qla_qpair_hint *
 282 qla_qpair_to_hint(struct qla_tgt *tgt, struct qla_qpair *qpair)
 283 {
 284         struct qla_qpair_hint *h;
 285         u16 i;
 286 
 287         for (i = 0; i < tgt->ha->max_qpairs + 1; i++) {
 288                 h = &tgt->qphints[i];
 289                 if (h->qpair == qpair)
 290                         return h;
 291         }
 292 
 293         return NULL;
 294 }
 295 
 296 static inline void
 297 qla_83xx_start_iocbs(struct qla_qpair *qpair)
 298 {
 299         struct req_que *req = qpair->req;
 300 
 301         req->ring_index++;
 302         if (req->ring_index == req->length) {
 303                 req->ring_index = 0;
 304                 req->ring_ptr = req->ring;
 305         } else
 306                 req->ring_ptr++;
 307 
 308         WRT_REG_DWORD(req->req_q_in, req->ring_index);
 309 }

/* [<][>][^][v][top][bottom][index][help] */