2 * Copyright 2008 Cisco Systems, Inc. All rights reserved.
3 * Copyright 2007 Nuova Systems, Inc. All rights reserved.
5 * This program is free software; you may redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
9 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
10 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
13 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
14 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 #include "wq_enet_desc.h"
22 #include "rq_enet_desc.h"
27 #include "vnic_wq_copy.h"
28 #include "vnic_cq_copy.h"
30 static inline void fnic_queue_wq_desc(struct vnic_wq
*wq
,
31 void *os_buf
, dma_addr_t dma_addr
,
32 unsigned int len
, unsigned int fc_eof
,
34 unsigned int vlan_tag
,
35 int cq_entry
, int sop
, int eop
)
37 struct wq_enet_desc
*desc
= vnic_wq_next_desc(wq
);
39 wq_enet_desc_enc(desc
,
40 (u64
)dma_addr
| VNIC_PADDR_TARGET
,
42 0, /* mss_or_csum_offset */
45 (u8
)eop
, (u8
)cq_entry
,
51 vnic_wq_post(wq
, os_buf
, dma_addr
, len
, sop
, eop
);
54 static inline void fnic_queue_wq_eth_desc(struct vnic_wq
*wq
,
55 void *os_buf
, dma_addr_t dma_addr
,
58 unsigned int vlan_tag
,
61 struct wq_enet_desc
*desc
= vnic_wq_next_desc(wq
);
63 wq_enet_desc_enc(desc
,
64 (u64
)dma_addr
| VNIC_PADDR_TARGET
,
66 0, /* mss_or_csum_offset */
76 vnic_wq_post(wq
, os_buf
, dma_addr
, len
, 1, 1);
79 static inline void fnic_queue_wq_copy_desc_icmnd_16(struct vnic_wq_copy
*wq
,
81 u32 lunmap_id
, u8 spl_flags
,
82 u32 sgl_cnt
, u32 sense_len
,
83 u64 sgl_addr
, u64 sns_addr
,
85 u8 flags
, u8
*scsi_cdb
,
87 u32 data_len
, u8
*lun
,
91 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
93 desc
->hdr
.type
= FCPIO_ICMND_16
; /* enum fcpio_type */
94 desc
->hdr
.status
= 0; /* header status entry */
95 desc
->hdr
._resvd
= 0; /* reserved */
96 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
98 desc
->u
.icmnd_16
.lunmap_id
= lunmap_id
; /* index into lunmap table */
99 desc
->u
.icmnd_16
.special_req_flags
= spl_flags
; /* exch req flags */
100 desc
->u
.icmnd_16
._resvd0
[0] = 0; /* reserved */
101 desc
->u
.icmnd_16
._resvd0
[1] = 0; /* reserved */
102 desc
->u
.icmnd_16
._resvd0
[2] = 0; /* reserved */
103 desc
->u
.icmnd_16
.sgl_cnt
= sgl_cnt
; /* scatter-gather list count */
104 desc
->u
.icmnd_16
.sense_len
= sense_len
; /* sense buffer length */
105 desc
->u
.icmnd_16
.sgl_addr
= sgl_addr
; /* scatter-gather list addr */
106 desc
->u
.icmnd_16
.sense_addr
= sns_addr
; /* sense buffer address */
107 desc
->u
.icmnd_16
.crn
= crn
; /* SCSI Command Reference No.*/
108 desc
->u
.icmnd_16
.pri_ta
= pri_ta
; /* SCSI Pri & Task attribute */
109 desc
->u
.icmnd_16
._resvd1
= 0; /* reserved: should be 0 */
110 desc
->u
.icmnd_16
.flags
= flags
; /* command flags */
111 memset(desc
->u
.icmnd_16
.scsi_cdb
, 0, CDB_16
);
112 memcpy(desc
->u
.icmnd_16
.scsi_cdb
, scsi_cdb
, cdb_len
); /* SCSI CDB */
113 desc
->u
.icmnd_16
.data_len
= data_len
; /* length of data expected */
114 memcpy(desc
->u
.icmnd_16
.lun
, lun
, LUN_ADDRESS
); /* LUN address */
115 desc
->u
.icmnd_16
._resvd2
= 0; /* reserved */
116 hton24(desc
->u
.icmnd_16
.d_id
, d_id
); /* FC vNIC only: Target D_ID */
117 desc
->u
.icmnd_16
.mss
= mss
; /* FC vNIC only: max burst */
118 desc
->u
.icmnd_16
.r_a_tov
= ratov
; /*FC vNIC only: Res. Alloc Timeout */
119 desc
->u
.icmnd_16
.e_d_tov
= edtov
; /*FC vNIC only: Err Detect Timeout */
121 vnic_wq_copy_post(wq
);
124 static inline void fnic_queue_wq_copy_desc_itmf(struct vnic_wq_copy
*wq
,
125 u32 req_id
, u32 lunmap_id
,
126 u32 tm_req
, u32 tm_id
, u8
*lun
,
127 u32 d_id
, u32 r_a_tov
,
130 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
132 desc
->hdr
.type
= FCPIO_ITMF
; /* enum fcpio_type */
133 desc
->hdr
.status
= 0; /* header status entry */
134 desc
->hdr
._resvd
= 0; /* reserved */
135 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
137 desc
->u
.itmf
.lunmap_id
= lunmap_id
; /* index into lunmap table */
138 desc
->u
.itmf
.tm_req
= tm_req
; /* SCSI Task Management request */
139 desc
->u
.itmf
.t_tag
= tm_id
; /* tag of fcpio to be aborted */
140 desc
->u
.itmf
._resvd
= 0;
141 memcpy(desc
->u
.itmf
.lun
, lun
, LUN_ADDRESS
); /* LUN address */
142 desc
->u
.itmf
._resvd1
= 0;
143 hton24(desc
->u
.itmf
.d_id
, d_id
); /* FC vNIC only: Target D_ID */
144 desc
->u
.itmf
.r_a_tov
= r_a_tov
; /* FC vNIC only: R_A_TOV in msec */
145 desc
->u
.itmf
.e_d_tov
= e_d_tov
; /* FC vNIC only: E_D_TOV in msec */
147 vnic_wq_copy_post(wq
);
150 static inline void fnic_queue_wq_copy_desc_flogi_reg(struct vnic_wq_copy
*wq
,
151 u32 req_id
, u8 format
,
152 u32 s_id
, u8
*gw_mac
)
154 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
156 desc
->hdr
.type
= FCPIO_FLOGI_REG
; /* enum fcpio_type */
157 desc
->hdr
.status
= 0; /* header status entry */
158 desc
->hdr
._resvd
= 0; /* reserved */
159 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
161 desc
->u
.flogi_reg
.format
= format
;
162 desc
->u
.flogi_reg
._resvd
= 0;
163 hton24(desc
->u
.flogi_reg
.s_id
, s_id
);
164 memcpy(desc
->u
.flogi_reg
.gateway_mac
, gw_mac
, ETH_ALEN
);
166 vnic_wq_copy_post(wq
);
169 static inline void fnic_queue_wq_copy_desc_fip_reg(struct vnic_wq_copy
*wq
,
170 u32 req_id
, u32 s_id
,
171 u8
*fcf_mac
, u8
*ha_mac
,
172 u32 r_a_tov
, u32 e_d_tov
)
174 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
176 desc
->hdr
.type
= FCPIO_FLOGI_FIP_REG
; /* enum fcpio_type */
177 desc
->hdr
.status
= 0; /* header status entry */
178 desc
->hdr
._resvd
= 0; /* reserved */
179 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
181 desc
->u
.flogi_fip_reg
._resvd0
= 0;
182 hton24(desc
->u
.flogi_fip_reg
.s_id
, s_id
);
183 memcpy(desc
->u
.flogi_fip_reg
.fcf_mac
, fcf_mac
, ETH_ALEN
);
184 desc
->u
.flogi_fip_reg
._resvd1
= 0;
185 desc
->u
.flogi_fip_reg
.r_a_tov
= r_a_tov
;
186 desc
->u
.flogi_fip_reg
.e_d_tov
= e_d_tov
;
187 memcpy(desc
->u
.flogi_fip_reg
.ha_mac
, ha_mac
, ETH_ALEN
);
188 desc
->u
.flogi_fip_reg
._resvd2
= 0;
190 vnic_wq_copy_post(wq
);
193 static inline void fnic_queue_wq_copy_desc_fw_reset(struct vnic_wq_copy
*wq
,
196 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
198 desc
->hdr
.type
= FCPIO_RESET
; /* enum fcpio_type */
199 desc
->hdr
.status
= 0; /* header status entry */
200 desc
->hdr
._resvd
= 0; /* reserved */
201 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
203 vnic_wq_copy_post(wq
);
206 static inline void fnic_queue_wq_copy_desc_lunmap(struct vnic_wq_copy
*wq
,
207 u32 req_id
, u64 lunmap_addr
,
210 struct fcpio_host_req
*desc
= vnic_wq_copy_next_desc(wq
);
212 desc
->hdr
.type
= FCPIO_LUNMAP_REQ
; /* enum fcpio_type */
213 desc
->hdr
.status
= 0; /* header status entry */
214 desc
->hdr
._resvd
= 0; /* reserved */
215 desc
->hdr
.tag
.u
.req_id
= req_id
; /* id for this request */
217 desc
->u
.lunmap_req
.addr
= lunmap_addr
; /* address of the buffer */
218 desc
->u
.lunmap_req
.len
= lunmap_len
; /* len of the buffer */
220 vnic_wq_copy_post(wq
);
223 static inline void fnic_queue_rq_desc(struct vnic_rq
*rq
,
224 void *os_buf
, dma_addr_t dma_addr
,
227 struct rq_enet_desc
*desc
= vnic_rq_next_desc(rq
);
229 rq_enet_desc_enc(desc
,
230 (u64
)dma_addr
| VNIC_PADDR_TARGET
,
231 RQ_ENET_TYPE_ONLY_SOP
,
234 vnic_rq_post(rq
, os_buf
, 0, dma_addr
, len
);
240 int fnic_get_vnic_config(struct fnic
*);
241 int fnic_alloc_vnic_resources(struct fnic
*);
242 void fnic_free_vnic_resources(struct fnic
*);
243 void fnic_get_res_counts(struct fnic
*);
244 int fnic_set_nic_config(struct fnic
*fnic
, u8 rss_default_cpu
,
245 u8 rss_hash_type
, u8 rss_hash_bits
, u8 rss_base_cpu
,
246 u8 rss_enable
, u8 tso_ipid_split_en
,
247 u8 ig_vlan_strip_en
);
249 #endif /* _FNIC_RES_H_ */