Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
0004  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
0005  */
0006 #ifndef _FNIC_RES_H_
0007 #define _FNIC_RES_H_
0008 
0009 #include "wq_enet_desc.h"
0010 #include "rq_enet_desc.h"
0011 #include "vnic_wq.h"
0012 #include "vnic_rq.h"
0013 #include "fnic_io.h"
0014 #include "fcpio.h"
0015 #include "vnic_wq_copy.h"
0016 #include "vnic_cq_copy.h"
0017 
0018 static inline void fnic_queue_wq_desc(struct vnic_wq *wq,
0019                       void *os_buf, dma_addr_t dma_addr,
0020                       unsigned int len, unsigned int fc_eof,
0021                       int vlan_tag_insert,
0022                       unsigned int vlan_tag,
0023                       int cq_entry, int sop, int eop)
0024 {
0025     struct wq_enet_desc *desc = vnic_wq_next_desc(wq);
0026 
0027     wq_enet_desc_enc(desc,
0028              (u64)dma_addr | VNIC_PADDR_TARGET,
0029              (u16)len,
0030              0, /* mss_or_csum_offset */
0031              (u16)fc_eof,
0032              0, /* offload_mode */
0033              (u8)eop, (u8)cq_entry,
0034              1, /* fcoe_encap */
0035              (u8)vlan_tag_insert,
0036              (u16)vlan_tag,
0037              0 /* loopback */);
0038 
0039     vnic_wq_post(wq, os_buf, dma_addr, len, sop, eop);
0040 }
0041 
0042 static inline void fnic_queue_wq_eth_desc(struct vnic_wq *wq,
0043                       void *os_buf, dma_addr_t dma_addr,
0044                       unsigned int len,
0045                       int vlan_tag_insert,
0046                       unsigned int vlan_tag,
0047                       int cq_entry)
0048 {
0049     struct wq_enet_desc *desc = vnic_wq_next_desc(wq);
0050 
0051     wq_enet_desc_enc(desc,
0052              (u64)dma_addr | VNIC_PADDR_TARGET,
0053              (u16)len,
0054              0, /* mss_or_csum_offset */
0055              0, /* fc_eof */
0056              0, /* offload_mode */
0057              1, /* eop */
0058              (u8)cq_entry,
0059              0, /* fcoe_encap */
0060              (u8)vlan_tag_insert,
0061              (u16)vlan_tag,
0062              0 /* loopback */);
0063 
0064     vnic_wq_post(wq, os_buf, dma_addr, len, 1, 1);
0065 }
0066 
0067 static inline void fnic_queue_wq_copy_desc_icmnd_16(struct vnic_wq_copy *wq,
0068                             u32 req_id,
0069                             u32 lunmap_id, u8 spl_flags,
0070                             u32 sgl_cnt, u32 sense_len,
0071                             u64 sgl_addr, u64 sns_addr,
0072                             u8 crn, u8 pri_ta,
0073                             u8 flags, u8 *scsi_cdb,
0074                             u8 cdb_len,
0075                             u32 data_len, u8 *lun,
0076                             u32 d_id, u16 mss,
0077                             u32 ratov, u32 edtov)
0078 {
0079     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0080 
0081     desc->hdr.type = FCPIO_ICMND_16; /* enum fcpio_type */
0082     desc->hdr.status = 0;            /* header status entry */
0083     desc->hdr._resvd = 0;            /* reserved */
0084     desc->hdr.tag.u.req_id = req_id; /* id for this request */
0085 
0086     desc->u.icmnd_16.lunmap_id = lunmap_id; /* index into lunmap table */
0087     desc->u.icmnd_16.special_req_flags = spl_flags; /* exch req flags */
0088     desc->u.icmnd_16._resvd0[0] = 0;        /* reserved */
0089     desc->u.icmnd_16._resvd0[1] = 0;        /* reserved */
0090     desc->u.icmnd_16._resvd0[2] = 0;        /* reserved */
0091     desc->u.icmnd_16.sgl_cnt = sgl_cnt;     /* scatter-gather list count */
0092     desc->u.icmnd_16.sense_len = sense_len; /* sense buffer length */
0093     desc->u.icmnd_16.sgl_addr = sgl_addr;   /* scatter-gather list addr */
0094     desc->u.icmnd_16.sense_addr = sns_addr; /* sense buffer address */
0095     desc->u.icmnd_16.crn = crn;             /* SCSI Command Reference No.*/
0096     desc->u.icmnd_16.pri_ta = pri_ta;   /* SCSI Pri & Task attribute */
0097     desc->u.icmnd_16._resvd1 = 0;           /* reserved: should be 0 */
0098     desc->u.icmnd_16.flags = flags;         /* command flags */
0099     memset(desc->u.icmnd_16.scsi_cdb, 0, CDB_16);
0100     memcpy(desc->u.icmnd_16.scsi_cdb, scsi_cdb, cdb_len);    /* SCSI CDB */
0101     desc->u.icmnd_16.data_len = data_len;   /* length of data expected */
0102     memcpy(desc->u.icmnd_16.lun, lun, LUN_ADDRESS);  /* LUN address */
0103     desc->u.icmnd_16._resvd2 = 0;           /* reserved */
0104     hton24(desc->u.icmnd_16.d_id, d_id);    /* FC vNIC only: Target D_ID */
0105     desc->u.icmnd_16.mss = mss;             /* FC vNIC only: max burst */
0106     desc->u.icmnd_16.r_a_tov = ratov; /*FC vNIC only: Res. Alloc Timeout */
0107     desc->u.icmnd_16.e_d_tov = edtov; /*FC vNIC only: Err Detect Timeout */
0108 
0109     vnic_wq_copy_post(wq);
0110 }
0111 
0112 static inline void fnic_queue_wq_copy_desc_itmf(struct vnic_wq_copy *wq,
0113                         u32 req_id, u32 lunmap_id,
0114                         u32 tm_req, u32 tm_id, u8 *lun,
0115                         u32 d_id, u32 r_a_tov,
0116                         u32 e_d_tov)
0117 {
0118     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0119 
0120     desc->hdr.type = FCPIO_ITMF;     /* enum fcpio_type */
0121     desc->hdr.status = 0;            /* header status entry */
0122     desc->hdr._resvd = 0;            /* reserved */
0123     desc->hdr.tag.u.req_id = req_id; /* id for this request */
0124 
0125     desc->u.itmf.lunmap_id = lunmap_id; /* index into lunmap table */
0126     desc->u.itmf.tm_req = tm_req;       /* SCSI Task Management request */
0127     desc->u.itmf.t_tag = tm_id;         /* tag of fcpio to be aborted */
0128     desc->u.itmf._resvd = 0;
0129     memcpy(desc->u.itmf.lun, lun, LUN_ADDRESS);  /* LUN address */
0130     desc->u.itmf._resvd1 = 0;
0131     hton24(desc->u.itmf.d_id, d_id);    /* FC vNIC only: Target D_ID */
0132     desc->u.itmf.r_a_tov = r_a_tov;     /* FC vNIC only: R_A_TOV in msec */
0133     desc->u.itmf.e_d_tov = e_d_tov;     /* FC vNIC only: E_D_TOV in msec */
0134 
0135     vnic_wq_copy_post(wq);
0136 }
0137 
0138 static inline void fnic_queue_wq_copy_desc_flogi_reg(struct vnic_wq_copy *wq,
0139                              u32 req_id, u8 format,
0140                              u32 s_id, u8 *gw_mac)
0141 {
0142     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0143 
0144     desc->hdr.type = FCPIO_FLOGI_REG;     /* enum fcpio_type */
0145     desc->hdr.status = 0;                 /* header status entry */
0146     desc->hdr._resvd = 0;                 /* reserved */
0147     desc->hdr.tag.u.req_id = req_id;      /* id for this request */
0148 
0149     desc->u.flogi_reg.format = format;
0150     desc->u.flogi_reg._resvd = 0;
0151     hton24(desc->u.flogi_reg.s_id, s_id);
0152     memcpy(desc->u.flogi_reg.gateway_mac, gw_mac, ETH_ALEN);
0153 
0154     vnic_wq_copy_post(wq);
0155 }
0156 
0157 static inline void fnic_queue_wq_copy_desc_fip_reg(struct vnic_wq_copy *wq,
0158                            u32 req_id, u32 s_id,
0159                            u8 *fcf_mac, u8 *ha_mac,
0160                            u32 r_a_tov, u32 e_d_tov)
0161 {
0162     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0163 
0164     desc->hdr.type = FCPIO_FLOGI_FIP_REG; /* enum fcpio_type */
0165     desc->hdr.status = 0;                 /* header status entry */
0166     desc->hdr._resvd = 0;                 /* reserved */
0167     desc->hdr.tag.u.req_id = req_id;      /* id for this request */
0168 
0169     desc->u.flogi_fip_reg._resvd0 = 0;
0170     hton24(desc->u.flogi_fip_reg.s_id, s_id);
0171     memcpy(desc->u.flogi_fip_reg.fcf_mac, fcf_mac, ETH_ALEN);
0172     desc->u.flogi_fip_reg._resvd1 = 0;
0173     desc->u.flogi_fip_reg.r_a_tov = r_a_tov;
0174     desc->u.flogi_fip_reg.e_d_tov = e_d_tov;
0175     memcpy(desc->u.flogi_fip_reg.ha_mac, ha_mac, ETH_ALEN);
0176     desc->u.flogi_fip_reg._resvd2 = 0;
0177 
0178     vnic_wq_copy_post(wq);
0179 }
0180 
0181 static inline void fnic_queue_wq_copy_desc_fw_reset(struct vnic_wq_copy *wq,
0182                             u32 req_id)
0183 {
0184     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0185 
0186     desc->hdr.type = FCPIO_RESET;     /* enum fcpio_type */
0187     desc->hdr.status = 0;             /* header status entry */
0188     desc->hdr._resvd = 0;             /* reserved */
0189     desc->hdr.tag.u.req_id = req_id;  /* id for this request */
0190 
0191     vnic_wq_copy_post(wq);
0192 }
0193 
0194 static inline void fnic_queue_wq_copy_desc_lunmap(struct vnic_wq_copy *wq,
0195                           u32 req_id, u64 lunmap_addr,
0196                           u32 lunmap_len)
0197 {
0198     struct fcpio_host_req *desc = vnic_wq_copy_next_desc(wq);
0199 
0200     desc->hdr.type = FCPIO_LUNMAP_REQ;  /* enum fcpio_type */
0201     desc->hdr.status = 0;           /* header status entry */
0202     desc->hdr._resvd = 0;           /* reserved */
0203     desc->hdr.tag.u.req_id = req_id;    /* id for this request */
0204 
0205     desc->u.lunmap_req.addr = lunmap_addr;  /* address of the buffer */
0206     desc->u.lunmap_req.len = lunmap_len;    /* len of the buffer */
0207 
0208     vnic_wq_copy_post(wq);
0209 }
0210 
0211 static inline void fnic_queue_rq_desc(struct vnic_rq *rq,
0212                       void *os_buf, dma_addr_t dma_addr,
0213                       u16 len)
0214 {
0215     struct rq_enet_desc *desc = vnic_rq_next_desc(rq);
0216 
0217     rq_enet_desc_enc(desc,
0218         (u64)dma_addr | VNIC_PADDR_TARGET,
0219         RQ_ENET_TYPE_ONLY_SOP,
0220         (u16)len);
0221 
0222     vnic_rq_post(rq, os_buf, 0, dma_addr, len);
0223 }
0224 
0225 
0226 struct fnic;
0227 
0228 int fnic_get_vnic_config(struct fnic *);
0229 int fnic_alloc_vnic_resources(struct fnic *);
0230 void fnic_free_vnic_resources(struct fnic *);
0231 void fnic_get_res_counts(struct fnic *);
0232 int fnic_set_nic_config(struct fnic *fnic, u8 rss_default_cpu,
0233             u8 rss_hash_type, u8 rss_hash_bits, u8 rss_base_cpu,
0234             u8 rss_enable, u8 tso_ipid_split_en,
0235             u8 ig_vlan_strip_en);
0236 
0237 #endif /* _FNIC_RES_H_ */