PageRenderTime 32ms CodeModel.GetById 22ms app.highlight 8ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/scsi/bfa/bfa_cb_ioim_macros.h

https://bitbucket.org/abioy/linux
C Header | 205 lines | 112 code | 32 blank | 61 comment | 9 complexity | e76a3978cd220c794e19ecb2c03d1561 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, GPL-2.0, LGPL-2.0, AGPL-1.0
  1/*
  2 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
  3 * All rights reserved
  4 * www.brocade.com
  5 *
  6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
  7 *
  8 * This program is free software; you can redistribute it and/or modify it
  9 * under the terms of the GNU General Public License (GPL) Version 2 as
 10 * published by the Free Software Foundation
 11 *
 12 * This program is distributed in the hope that it will be useful, but
 13 * WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 15 * General Public License for more details.
 16 */
 17
 18/**
 19 *  bfa_cb_ioim_macros.h BFA IOIM driver interface macros.
 20 */
 21
 22#ifndef __BFA_HCB_IOIM_MACROS_H__
 23#define __BFA_HCB_IOIM_MACROS_H__
 24
 25#include <bfa_os_inc.h>
 26/*
 27 * #include <linux/dma-mapping.h>
 28 *
 29 * #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h> #include
 30 * <scsi/scsi_device.h> #include <scsi/scsi_host.h>
 31 */
 32#include "bfad_im_compat.h"
 33
 34/*
 35 * task attribute values in FCP-2 FCP_CMND IU
 36 */
 37#define SIMPLE_Q    0
 38#define HEAD_OF_Q   1
 39#define ORDERED_Q   2
 40#define ACA_Q       4
 41#define UNTAGGED    5
 42
 43static inline lun_t
 44bfad_int_to_lun(u32 luno)
 45{
 46	union {
 47		u16        scsi_lun[4];
 48		lun_t           bfa_lun;
 49	} lun;
 50
 51	lun.bfa_lun     = 0;
 52	lun.scsi_lun[0] = bfa_os_htons(luno);
 53
 54	return lun.bfa_lun;
 55}
 56
 57/**
 58 * Get LUN for the I/O request
 59 */
 60#define bfa_cb_ioim_get_lun(__dio)	\
 61	bfad_int_to_lun(((struct scsi_cmnd *)__dio)->device->lun)
 62
 63/**
 64 * Get CDB for the I/O request
 65 */
 66static inline u8 *
 67bfa_cb_ioim_get_cdb(struct bfad_ioim_s *dio)
 68{
 69	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
 70
 71	return (u8 *) cmnd->cmnd;
 72}
 73
 74/**
 75 * Get I/O direction (read/write) for the I/O request
 76 */
 77static inline enum fcp_iodir
 78bfa_cb_ioim_get_iodir(struct bfad_ioim_s *dio)
 79{
 80	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
 81	enum dma_data_direction dmadir;
 82
 83	dmadir = cmnd->sc_data_direction;
 84	if (dmadir == DMA_TO_DEVICE)
 85		return FCP_IODIR_WRITE;
 86	else if (dmadir == DMA_FROM_DEVICE)
 87		return FCP_IODIR_READ;
 88	else
 89		return FCP_IODIR_NONE;
 90}
 91
 92/**
 93 * Get IO size in bytes for the I/O request
 94 */
 95static inline u32
 96bfa_cb_ioim_get_size(struct bfad_ioim_s *dio)
 97{
 98	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
 99
100	return scsi_bufflen(cmnd);
101}
102
103/**
104 * Get timeout for the I/O request
105 */
106static inline u8
107bfa_cb_ioim_get_timeout(struct bfad_ioim_s *dio)
108{
109	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
110	/*
111	 * TBD: need a timeout for scsi passthru
112	 */
113	if (cmnd->device->host == NULL)
114		return 4;
115
116	return 0;
117}
118
119/**
120 * Get SG element for the I/O request given the SG element index
121 */
122static inline union bfi_addr_u
123bfa_cb_ioim_get_sgaddr(struct bfad_ioim_s *dio, int sgeid)
124{
125	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
126	struct scatterlist *sge;
127	u64        addr;
128
129	sge = (struct scatterlist *)scsi_sglist(cmnd) + sgeid;
130	addr = (u64) sg_dma_address(sge);
131
132	return *((union bfi_addr_u *) &addr);
133}
134
135static inline u32
136bfa_cb_ioim_get_sglen(struct bfad_ioim_s *dio, int sgeid)
137{
138	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
139	struct scatterlist *sge;
140	u32        len;
141
142	sge = (struct scatterlist *)scsi_sglist(cmnd) + sgeid;
143	len = sg_dma_len(sge);
144
145	return len;
146}
147
148/**
149 * Get Command Reference Number for the I/O request. 0 if none.
150 */
151static inline u8
152bfa_cb_ioim_get_crn(struct bfad_ioim_s *dio)
153{
154	return 0;
155}
156
157/**
158 * Get SAM-3 priority for the I/O request. 0 is default.
159 */
160static inline u8
161bfa_cb_ioim_get_priority(struct bfad_ioim_s *dio)
162{
163	return 0;
164}
165
166/**
167 * Get task attributes for the I/O request. Default is FCP_TASK_ATTR_SIMPLE(0).
168 */
169static inline u8
170bfa_cb_ioim_get_taskattr(struct bfad_ioim_s *dio)
171{
172	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
173	u8         task_attr = UNTAGGED;
174
175	if (cmnd->device->tagged_supported) {
176		switch (cmnd->tag) {
177		case HEAD_OF_QUEUE_TAG:
178			task_attr = HEAD_OF_Q;
179			break;
180		case ORDERED_QUEUE_TAG:
181			task_attr = ORDERED_Q;
182			break;
183		default:
184			task_attr = SIMPLE_Q;
185			break;
186		}
187	}
188
189	return task_attr;
190}
191
192/**
193 * Get CDB length in bytes for the I/O request. Default is FCP_CMND_CDB_LEN(16).
194 */
195static inline u8
196bfa_cb_ioim_get_cdblen(struct bfad_ioim_s *dio)
197{
198	struct scsi_cmnd *cmnd = (struct scsi_cmnd *)dio;
199
200	return cmnd->cmd_len;
201}
202
203
204
205#endif /* __BFA_HCB_IOIM_MACROS_H__ */