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