18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
38c2ecf20Sopenharmony_ci * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * This program is free software; you may redistribute it and/or modify
68c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License as published by
78c2ecf20Sopenharmony_ci * the Free Software Foundation; version 2 of the License.
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
108c2ecf20Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
118c2ecf20Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
128c2ecf20Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
138c2ecf20Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
148c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
158c2ecf20Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
168c2ecf20Sopenharmony_ci * SOFTWARE.
178c2ecf20Sopenharmony_ci */
188c2ecf20Sopenharmony_ci#ifndef _FNIC_RES_H_
198c2ecf20Sopenharmony_ci#define _FNIC_RES_H_
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include "wq_enet_desc.h"
228c2ecf20Sopenharmony_ci#include "rq_enet_desc.h"
238c2ecf20Sopenharmony_ci#include "vnic_wq.h"
248c2ecf20Sopenharmony_ci#include "vnic_rq.h"
258c2ecf20Sopenharmony_ci#include "fnic_io.h"
268c2ecf20Sopenharmony_ci#include "fcpio.h"
278c2ecf20Sopenharmony_ci#include "vnic_wq_copy.h"
288c2ecf20Sopenharmony_ci#include "vnic_cq_copy.h"
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_desc(struct vnic_wq *wq,
318c2ecf20Sopenharmony_ci				      void *os_buf, dma_addr_t dma_addr,
328c2ecf20Sopenharmony_ci				      unsigned int len, unsigned int fc_eof,
338c2ecf20Sopenharmony_ci				      int vlan_tag_insert,
348c2ecf20Sopenharmony_ci				      unsigned int vlan_tag,
358c2ecf20Sopenharmony_ci				      int cq_entry, int sop, int eop)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	struct wq_enet_desc *desc = vnic_wq_next_desc(wq);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	wq_enet_desc_enc(desc,
408c2ecf20Sopenharmony_ci			 (u64)dma_addr | VNIC_PADDR_TARGET,
418c2ecf20Sopenharmony_ci			 (u16)len,
428c2ecf20Sopenharmony_ci			 0, /* mss_or_csum_offset */
438c2ecf20Sopenharmony_ci			 (u16)fc_eof,
448c2ecf20Sopenharmony_ci			 0, /* offload_mode */
458c2ecf20Sopenharmony_ci			 (u8)eop, (u8)cq_entry,
468c2ecf20Sopenharmony_ci			 1, /* fcoe_encap */
478c2ecf20Sopenharmony_ci			 (u8)vlan_tag_insert,
488c2ecf20Sopenharmony_ci			 (u16)vlan_tag,
498c2ecf20Sopenharmony_ci			 0 /* loopback */);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	vnic_wq_post(wq, os_buf, dma_addr, len, sop, eop);
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_eth_desc(struct vnic_wq *wq,
558c2ecf20Sopenharmony_ci				      void *os_buf, dma_addr_t dma_addr,
568c2ecf20Sopenharmony_ci				      unsigned int len,
578c2ecf20Sopenharmony_ci				      int vlan_tag_insert,
588c2ecf20Sopenharmony_ci				      unsigned int vlan_tag,
598c2ecf20Sopenharmony_ci				      int cq_entry)
608c2ecf20Sopenharmony_ci{
618c2ecf20Sopenharmony_ci	struct wq_enet_desc *desc = vnic_wq_next_desc(wq);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	wq_enet_desc_enc(desc,
648c2ecf20Sopenharmony_ci			 (u64)dma_addr | VNIC_PADDR_TARGET,
658c2ecf20Sopenharmony_ci			 (u16)len,
668c2ecf20Sopenharmony_ci			 0, /* mss_or_csum_offset */
678c2ecf20Sopenharmony_ci			 0, /* fc_eof */
688c2ecf20Sopenharmony_ci			 0, /* offload_mode */
698c2ecf20Sopenharmony_ci			 1, /* eop */
708c2ecf20Sopenharmony_ci			 (u8)cq_entry,
718c2ecf20Sopenharmony_ci			 0, /* fcoe_encap */
728c2ecf20Sopenharmony_ci			 (u8)vlan_tag_insert,
738c2ecf20Sopenharmony_ci			 (u16)vlan_tag,
748c2ecf20Sopenharmony_ci			 0 /* loopback */);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	vnic_wq_post(wq, os_buf, dma_addr, len, 1, 1);
778c2ecf20Sopenharmony_ci}
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_icmnd_16(struct vnic_wq_copy *wq,
808c2ecf20Sopenharmony_ci						    u32 req_id,
818c2ecf20Sopenharmony_ci						    u32 lunmap_id, u8 spl_flags,
828c2ecf20Sopenharmony_ci						    u32 sgl_cnt, u32 sense_len,
838c2ecf20Sopenharmony_ci						    u64 sgl_addr, u64 sns_addr,
848c2ecf20Sopenharmony_ci						    u8 crn, u8 pri_ta,
858c2ecf20Sopenharmony_ci						    u8 flags, u8 *scsi_cdb,
868c2ecf20Sopenharmony_ci						    u8 cdb_len,
878c2ecf20Sopenharmony_ci						    u32 data_len, u8 *lun,
888c2ecf20Sopenharmony_ci						    u32 d_id, u16 mss,
898c2ecf20Sopenharmony_ci						    u32 ratov, u32 edtov)
908c2ecf20Sopenharmony_ci{
918c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_ICMND_16; /* enum fcpio_type */
948c2ecf20Sopenharmony_ci	desc->hdr.status = 0;            /* header status entry */
958c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;            /* reserved */
968c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id; /* id for this request */
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	desc->u.icmnd_16.lunmap_id = lunmap_id; /* index into lunmap table */
998c2ecf20Sopenharmony_ci	desc->u.icmnd_16.special_req_flags = spl_flags; /* exch req flags */
1008c2ecf20Sopenharmony_ci	desc->u.icmnd_16._resvd0[0] = 0;        /* reserved */
1018c2ecf20Sopenharmony_ci	desc->u.icmnd_16._resvd0[1] = 0;        /* reserved */
1028c2ecf20Sopenharmony_ci	desc->u.icmnd_16._resvd0[2] = 0;        /* reserved */
1038c2ecf20Sopenharmony_ci	desc->u.icmnd_16.sgl_cnt = sgl_cnt;     /* scatter-gather list count */
1048c2ecf20Sopenharmony_ci	desc->u.icmnd_16.sense_len = sense_len; /* sense buffer length */
1058c2ecf20Sopenharmony_ci	desc->u.icmnd_16.sgl_addr = sgl_addr;   /* scatter-gather list addr */
1068c2ecf20Sopenharmony_ci	desc->u.icmnd_16.sense_addr = sns_addr; /* sense buffer address */
1078c2ecf20Sopenharmony_ci	desc->u.icmnd_16.crn = crn;             /* SCSI Command Reference No.*/
1088c2ecf20Sopenharmony_ci	desc->u.icmnd_16.pri_ta = pri_ta; 	/* SCSI Pri & Task attribute */
1098c2ecf20Sopenharmony_ci	desc->u.icmnd_16._resvd1 = 0;           /* reserved: should be 0 */
1108c2ecf20Sopenharmony_ci	desc->u.icmnd_16.flags = flags;         /* command flags */
1118c2ecf20Sopenharmony_ci	memset(desc->u.icmnd_16.scsi_cdb, 0, CDB_16);
1128c2ecf20Sopenharmony_ci	memcpy(desc->u.icmnd_16.scsi_cdb, scsi_cdb, cdb_len);    /* SCSI CDB */
1138c2ecf20Sopenharmony_ci	desc->u.icmnd_16.data_len = data_len;   /* length of data expected */
1148c2ecf20Sopenharmony_ci	memcpy(desc->u.icmnd_16.lun, lun, LUN_ADDRESS);  /* LUN address */
1158c2ecf20Sopenharmony_ci	desc->u.icmnd_16._resvd2 = 0;          	/* reserved */
1168c2ecf20Sopenharmony_ci	hton24(desc->u.icmnd_16.d_id, d_id);	/* FC vNIC only: Target D_ID */
1178c2ecf20Sopenharmony_ci	desc->u.icmnd_16.mss = mss;            	/* FC vNIC only: max burst */
1188c2ecf20Sopenharmony_ci	desc->u.icmnd_16.r_a_tov = ratov; /*FC vNIC only: Res. Alloc Timeout */
1198c2ecf20Sopenharmony_ci	desc->u.icmnd_16.e_d_tov = edtov; /*FC vNIC only: Err Detect Timeout */
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
1228c2ecf20Sopenharmony_ci}
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_itmf(struct vnic_wq_copy *wq,
1258c2ecf20Sopenharmony_ci						u32 req_id, u32 lunmap_id,
1268c2ecf20Sopenharmony_ci						u32 tm_req, u32 tm_id, u8 *lun,
1278c2ecf20Sopenharmony_ci						u32 d_id, u32 r_a_tov,
1288c2ecf20Sopenharmony_ci						u32 e_d_tov)
1298c2ecf20Sopenharmony_ci{
1308c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_ITMF;     /* enum fcpio_type */
1338c2ecf20Sopenharmony_ci	desc->hdr.status = 0;            /* header status entry */
1348c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;            /* reserved */
1358c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id; /* id for this request */
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	desc->u.itmf.lunmap_id = lunmap_id; /* index into lunmap table */
1388c2ecf20Sopenharmony_ci	desc->u.itmf.tm_req = tm_req;       /* SCSI Task Management request */
1398c2ecf20Sopenharmony_ci	desc->u.itmf.t_tag = tm_id;         /* tag of fcpio to be aborted */
1408c2ecf20Sopenharmony_ci	desc->u.itmf._resvd = 0;
1418c2ecf20Sopenharmony_ci	memcpy(desc->u.itmf.lun, lun, LUN_ADDRESS);  /* LUN address */
1428c2ecf20Sopenharmony_ci	desc->u.itmf._resvd1 = 0;
1438c2ecf20Sopenharmony_ci	hton24(desc->u.itmf.d_id, d_id);    /* FC vNIC only: Target D_ID */
1448c2ecf20Sopenharmony_ci	desc->u.itmf.r_a_tov = r_a_tov;     /* FC vNIC only: R_A_TOV in msec */
1458c2ecf20Sopenharmony_ci	desc->u.itmf.e_d_tov = e_d_tov;     /* FC vNIC only: E_D_TOV in msec */
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_flogi_reg(struct vnic_wq_copy *wq,
1518c2ecf20Sopenharmony_ci						     u32 req_id, u8 format,
1528c2ecf20Sopenharmony_ci						     u32 s_id, u8 *gw_mac)
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_FLOGI_REG;     /* enum fcpio_type */
1578c2ecf20Sopenharmony_ci	desc->hdr.status = 0;                 /* header status entry */
1588c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;                 /* reserved */
1598c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id;      /* id for this request */
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	desc->u.flogi_reg.format = format;
1628c2ecf20Sopenharmony_ci	desc->u.flogi_reg._resvd = 0;
1638c2ecf20Sopenharmony_ci	hton24(desc->u.flogi_reg.s_id, s_id);
1648c2ecf20Sopenharmony_ci	memcpy(desc->u.flogi_reg.gateway_mac, gw_mac, ETH_ALEN);
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
1678c2ecf20Sopenharmony_ci}
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_fip_reg(struct vnic_wq_copy *wq,
1708c2ecf20Sopenharmony_ci						   u32 req_id, u32 s_id,
1718c2ecf20Sopenharmony_ci						   u8 *fcf_mac, u8 *ha_mac,
1728c2ecf20Sopenharmony_ci						   u32 r_a_tov, u32 e_d_tov)
1738c2ecf20Sopenharmony_ci{
1748c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_FLOGI_FIP_REG; /* enum fcpio_type */
1778c2ecf20Sopenharmony_ci	desc->hdr.status = 0;                 /* header status entry */
1788c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;                 /* reserved */
1798c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id;      /* id for this request */
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	desc->u.flogi_fip_reg._resvd0 = 0;
1828c2ecf20Sopenharmony_ci	hton24(desc->u.flogi_fip_reg.s_id, s_id);
1838c2ecf20Sopenharmony_ci	memcpy(desc->u.flogi_fip_reg.fcf_mac, fcf_mac, ETH_ALEN);
1848c2ecf20Sopenharmony_ci	desc->u.flogi_fip_reg._resvd1 = 0;
1858c2ecf20Sopenharmony_ci	desc->u.flogi_fip_reg.r_a_tov = r_a_tov;
1868c2ecf20Sopenharmony_ci	desc->u.flogi_fip_reg.e_d_tov = e_d_tov;
1878c2ecf20Sopenharmony_ci	memcpy(desc->u.flogi_fip_reg.ha_mac, ha_mac, ETH_ALEN);
1888c2ecf20Sopenharmony_ci	desc->u.flogi_fip_reg._resvd2 = 0;
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
1918c2ecf20Sopenharmony_ci}
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_fw_reset(struct vnic_wq_copy *wq,
1948c2ecf20Sopenharmony_ci						    u32 req_id)
1958c2ecf20Sopenharmony_ci{
1968c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_RESET;     /* enum fcpio_type */
1998c2ecf20Sopenharmony_ci	desc->hdr.status = 0;             /* header status entry */
2008c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;             /* reserved */
2018c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id;  /* id for this request */
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
2048c2ecf20Sopenharmony_ci}
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_cistatic inline void fnic_queue_wq_copy_desc_lunmap(struct vnic_wq_copy *wq,
2078c2ecf20Sopenharmony_ci						  u32 req_id, u64 lunmap_addr,
2088c2ecf20Sopenharmony_ci						  u32 lunmap_len)
2098c2ecf20Sopenharmony_ci{
2108c2ecf20Sopenharmony_ci	struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	desc->hdr.type = FCPIO_LUNMAP_REQ;	/* enum fcpio_type */
2138c2ecf20Sopenharmony_ci	desc->hdr.status = 0;			/* header status entry */
2148c2ecf20Sopenharmony_ci	desc->hdr._resvd = 0;			/* reserved */
2158c2ecf20Sopenharmony_ci	desc->hdr.tag.u.req_id = req_id;	/* id for this request */
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci	desc->u.lunmap_req.addr = lunmap_addr;	/* address of the buffer */
2188c2ecf20Sopenharmony_ci	desc->u.lunmap_req.len = lunmap_len;	/* len of the buffer */
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	vnic_wq_copy_post(wq);
2218c2ecf20Sopenharmony_ci}
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_cistatic inline void fnic_queue_rq_desc(struct vnic_rq *rq,
2248c2ecf20Sopenharmony_ci				      void *os_buf, dma_addr_t dma_addr,
2258c2ecf20Sopenharmony_ci				      u16 len)
2268c2ecf20Sopenharmony_ci{
2278c2ecf20Sopenharmony_ci	struct rq_enet_desc *desc = vnic_rq_next_desc(rq);
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci	rq_enet_desc_enc(desc,
2308c2ecf20Sopenharmony_ci		(u64)dma_addr | VNIC_PADDR_TARGET,
2318c2ecf20Sopenharmony_ci		RQ_ENET_TYPE_ONLY_SOP,
2328c2ecf20Sopenharmony_ci		(u16)len);
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	vnic_rq_post(rq, os_buf, 0, dma_addr, len);
2358c2ecf20Sopenharmony_ci}
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_cistruct fnic;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ciint fnic_get_vnic_config(struct fnic *);
2418c2ecf20Sopenharmony_ciint fnic_alloc_vnic_resources(struct fnic *);
2428c2ecf20Sopenharmony_civoid fnic_free_vnic_resources(struct fnic *);
2438c2ecf20Sopenharmony_civoid fnic_get_res_counts(struct fnic *);
2448c2ecf20Sopenharmony_ciint fnic_set_nic_config(struct fnic *fnic, u8 rss_default_cpu,
2458c2ecf20Sopenharmony_ci			u8 rss_hash_type, u8 rss_hash_bits, u8 rss_base_cpu,
2468c2ecf20Sopenharmony_ci			u8 rss_enable, u8 tso_ipid_split_en,
2478c2ecf20Sopenharmony_ci			u8 ig_vlan_strip_en);
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci#endif /* _FNIC_RES_H_ */
250