1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * This file is part of the Chelsio FCoE driver for Linux. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This software is available to you under a choice of one of two 7*4882a593Smuzhiyun * licenses. You may choose to be licensed under the terms of the GNU 8*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file 9*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the 10*4882a593Smuzhiyun * OpenIB.org BSD license below: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or 13*4882a593Smuzhiyun * without modification, are permitted provided that the following 14*4882a593Smuzhiyun * conditions are met: 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * - Redistributions of source code must retain the above 17*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 18*4882a593Smuzhiyun * disclaimer. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above 21*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 22*4882a593Smuzhiyun * disclaimer in the documentation and/or other materials 23*4882a593Smuzhiyun * provided with the distribution. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*4882a593Smuzhiyun * SOFTWARE. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #ifndef __CSIO_MB_H__ 36*4882a593Smuzhiyun #define __CSIO_MB_H__ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #include <linux/timer.h> 39*4882a593Smuzhiyun #include <linux/completion.h> 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #include "t4fw_api.h" 42*4882a593Smuzhiyun #include "t4fw_api_stor.h" 43*4882a593Smuzhiyun #include "csio_defs.h" 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define CSIO_STATS_OFFSET (2) 46*4882a593Smuzhiyun #define CSIO_NUM_STATS_PER_MB (6) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct fw_fcoe_port_cmd_params { 49*4882a593Smuzhiyun uint8_t portid; 50*4882a593Smuzhiyun uint8_t idx; 51*4882a593Smuzhiyun uint8_t nstats; 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define CSIO_DUMP_MB(__hw, __num, __mb) \ 55*4882a593Smuzhiyun csio_dbg(__hw, "\t%llx %llx %llx %llx %llx %llx %llx %llx\n", \ 56*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb), \ 57*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 8), \ 58*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 16), \ 59*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 24), \ 60*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 32), \ 61*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 40), \ 62*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 48), \ 63*4882a593Smuzhiyun (unsigned long long)csio_rd_reg64(__hw, __mb + 56)) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define CSIO_MB_MAX_REGS 8 66*4882a593Smuzhiyun #define CSIO_MAX_MB_SIZE 64 67*4882a593Smuzhiyun #define CSIO_MB_POLL_FREQ 5 /* 5 ms */ 68*4882a593Smuzhiyun #define CSIO_MB_DEFAULT_TMO FW_CMD_MAX_TIMEOUT 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* Device master in HELLO command */ 71*4882a593Smuzhiyun enum csio_dev_master { CSIO_MASTER_CANT, CSIO_MASTER_MAY, CSIO_MASTER_MUST }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun enum csio_mb_owner { CSIO_MBOWNER_NONE, CSIO_MBOWNER_FW, CSIO_MBOWNER_PL }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun enum csio_dev_state { 76*4882a593Smuzhiyun CSIO_DEV_STATE_UNINIT, 77*4882a593Smuzhiyun CSIO_DEV_STATE_INIT, 78*4882a593Smuzhiyun CSIO_DEV_STATE_ERR 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define FW_PARAM_DEV(param) \ 82*4882a593Smuzhiyun (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | \ 83*4882a593Smuzhiyun FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_##param)) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define FW_PARAM_PFVF(param) \ 86*4882a593Smuzhiyun (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) | \ 87*4882a593Smuzhiyun FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_##param)| \ 88*4882a593Smuzhiyun FW_PARAMS_PARAM_Y_V(0) | \ 89*4882a593Smuzhiyun FW_PARAMS_PARAM_Z_V(0)) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define CSIO_INIT_MBP(__mbp, __cp, __tmo, __priv, __fn, __clear) \ 92*4882a593Smuzhiyun do { \ 93*4882a593Smuzhiyun if (__clear) \ 94*4882a593Smuzhiyun memset((__cp), 0, \ 95*4882a593Smuzhiyun CSIO_MB_MAX_REGS * sizeof(__be64)); \ 96*4882a593Smuzhiyun INIT_LIST_HEAD(&(__mbp)->list); \ 97*4882a593Smuzhiyun (__mbp)->tmo = (__tmo); \ 98*4882a593Smuzhiyun (__mbp)->priv = (void *)(__priv); \ 99*4882a593Smuzhiyun (__mbp)->mb_cbfn = (__fn); \ 100*4882a593Smuzhiyun (__mbp)->mb_size = sizeof(*(__cp)); \ 101*4882a593Smuzhiyun } while (0) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun struct csio_mbm_stats { 104*4882a593Smuzhiyun uint32_t n_req; /* number of mbox req */ 105*4882a593Smuzhiyun uint32_t n_rsp; /* number of mbox rsp */ 106*4882a593Smuzhiyun uint32_t n_activeq; /* number of mbox req active Q */ 107*4882a593Smuzhiyun uint32_t n_cbfnq; /* number of mbox req cbfn Q */ 108*4882a593Smuzhiyun uint32_t n_tmo; /* number of mbox timeout */ 109*4882a593Smuzhiyun uint32_t n_cancel; /* number of mbox cancel */ 110*4882a593Smuzhiyun uint32_t n_err; /* number of mbox error */ 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* Driver version of Mailbox */ 114*4882a593Smuzhiyun struct csio_mb { 115*4882a593Smuzhiyun struct list_head list; /* for req/resp */ 116*4882a593Smuzhiyun /* queue in driver */ 117*4882a593Smuzhiyun __be64 mb[CSIO_MB_MAX_REGS]; /* MB in HW format */ 118*4882a593Smuzhiyun int mb_size; /* Size of this 119*4882a593Smuzhiyun * mailbox. 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun uint32_t tmo; /* Timeout */ 122*4882a593Smuzhiyun struct completion cmplobj; /* MB Completion 123*4882a593Smuzhiyun * object 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun void (*mb_cbfn) (struct csio_hw *, struct csio_mb *); 126*4882a593Smuzhiyun /* Callback fn */ 127*4882a593Smuzhiyun void *priv; /* Owner private ptr */ 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun struct csio_mbm { 131*4882a593Smuzhiyun uint32_t a_mbox; /* Async mbox num */ 132*4882a593Smuzhiyun uint32_t intr_idx; /* Interrupt index */ 133*4882a593Smuzhiyun struct timer_list timer; /* Mbox timer */ 134*4882a593Smuzhiyun struct csio_hw *hw; /* Hardware pointer */ 135*4882a593Smuzhiyun struct list_head req_q; /* Mbox request queue */ 136*4882a593Smuzhiyun struct list_head cbfn_q; /* Mbox completion q */ 137*4882a593Smuzhiyun struct csio_mb *mcurrent; /* Current mailbox */ 138*4882a593Smuzhiyun uint32_t req_q_cnt; /* Outstanding mbox 139*4882a593Smuzhiyun * cmds 140*4882a593Smuzhiyun */ 141*4882a593Smuzhiyun struct csio_mbm_stats stats; /* Statistics */ 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define csio_set_mb_intr_idx(_m, _i) ((_m)->intr_idx = (_i)) 145*4882a593Smuzhiyun #define csio_get_mb_intr_idx(_m) ((_m)->intr_idx) 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct csio_iq_params; 148*4882a593Smuzhiyun struct csio_eq_params; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun enum fw_retval csio_mb_fw_retval(struct csio_mb *); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* MB helpers */ 153*4882a593Smuzhiyun void csio_mb_hello(struct csio_hw *, struct csio_mb *, uint32_t, 154*4882a593Smuzhiyun uint32_t, uint32_t, enum csio_dev_master, 155*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun void csio_mb_process_hello_rsp(struct csio_hw *, struct csio_mb *, 158*4882a593Smuzhiyun enum fw_retval *, enum csio_dev_state *, 159*4882a593Smuzhiyun uint8_t *); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun void csio_mb_bye(struct csio_hw *, struct csio_mb *, uint32_t, 162*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun void csio_mb_reset(struct csio_hw *, struct csio_mb *, uint32_t, int, int, 165*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun void csio_mb_params(struct csio_hw *, struct csio_mb *, uint32_t, unsigned int, 168*4882a593Smuzhiyun unsigned int, unsigned int, const u32 *, u32 *, bool, 169*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun void csio_mb_process_read_params_rsp(struct csio_hw *, struct csio_mb *, 172*4882a593Smuzhiyun enum fw_retval *, unsigned int , u32 *); 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun void csio_mb_ldst(struct csio_hw *hw, struct csio_mb *mbp, uint32_t tmo, 175*4882a593Smuzhiyun int reg); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun void csio_mb_caps_config(struct csio_hw *, struct csio_mb *, uint32_t, 178*4882a593Smuzhiyun bool, bool, bool, bool, 179*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun void csio_mb_port(struct csio_hw *, struct csio_mb *, uint32_t, 182*4882a593Smuzhiyun uint8_t, bool, uint32_t, uint16_t, 183*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun void csio_mb_process_read_port_rsp(struct csio_hw *, struct csio_mb *, 186*4882a593Smuzhiyun enum fw_retval *, uint16_t, 187*4882a593Smuzhiyun uint32_t *, uint32_t *); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun void csio_mb_initialize(struct csio_hw *, struct csio_mb *, uint32_t, 190*4882a593Smuzhiyun void (*)(struct csio_hw *, struct csio_mb *)); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun void csio_mb_iq_alloc_write(struct csio_hw *, struct csio_mb *, void *, 193*4882a593Smuzhiyun uint32_t, struct csio_iq_params *, 194*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun void csio_mb_iq_alloc_write_rsp(struct csio_hw *, struct csio_mb *, 197*4882a593Smuzhiyun enum fw_retval *, struct csio_iq_params *); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun void csio_mb_iq_free(struct csio_hw *, struct csio_mb *, void *, 200*4882a593Smuzhiyun uint32_t, struct csio_iq_params *, 201*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun void csio_mb_eq_ofld_alloc_write(struct csio_hw *, struct csio_mb *, void *, 204*4882a593Smuzhiyun uint32_t, struct csio_eq_params *, 205*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun void csio_mb_eq_ofld_alloc_write_rsp(struct csio_hw *, struct csio_mb *, 208*4882a593Smuzhiyun enum fw_retval *, struct csio_eq_params *); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun void csio_mb_eq_ofld_free(struct csio_hw *, struct csio_mb *, void *, 211*4882a593Smuzhiyun uint32_t , struct csio_eq_params *, 212*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun void csio_fcoe_read_res_info_init_mb(struct csio_hw *, struct csio_mb *, 215*4882a593Smuzhiyun uint32_t, 216*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun void csio_write_fcoe_link_cond_init_mb(struct csio_lnode *, struct csio_mb *, 219*4882a593Smuzhiyun uint32_t, uint8_t, uint32_t, uint8_t, bool, uint32_t, 220*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun void csio_fcoe_vnp_alloc_init_mb(struct csio_lnode *, struct csio_mb *, 223*4882a593Smuzhiyun uint32_t, uint32_t , uint32_t , uint16_t, 224*4882a593Smuzhiyun uint8_t [8], uint8_t [8], 225*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun void csio_fcoe_vnp_read_init_mb(struct csio_lnode *, struct csio_mb *, 228*4882a593Smuzhiyun uint32_t, uint32_t , uint32_t , 229*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun void csio_fcoe_vnp_free_init_mb(struct csio_lnode *, struct csio_mb *, 232*4882a593Smuzhiyun uint32_t , uint32_t, uint32_t , 233*4882a593Smuzhiyun void (*) (struct csio_hw *, struct csio_mb *)); 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun void csio_fcoe_read_fcf_init_mb(struct csio_lnode *, struct csio_mb *, 236*4882a593Smuzhiyun uint32_t, uint32_t, uint32_t, 237*4882a593Smuzhiyun void (*cbfn) (struct csio_hw *, struct csio_mb *)); 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun void csio_fcoe_read_portparams_init_mb(struct csio_hw *hw, 240*4882a593Smuzhiyun struct csio_mb *mbp, uint32_t mb_tmo, 241*4882a593Smuzhiyun struct fw_fcoe_port_cmd_params *portparams, 242*4882a593Smuzhiyun void (*cbfn)(struct csio_hw *, struct csio_mb *)); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun void csio_mb_process_portparams_rsp(struct csio_hw *hw, struct csio_mb *mbp, 245*4882a593Smuzhiyun enum fw_retval *retval, 246*4882a593Smuzhiyun struct fw_fcoe_port_cmd_params *portparams, 247*4882a593Smuzhiyun struct fw_fcoe_port_stats *portstats); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* MB module functions */ 250*4882a593Smuzhiyun int csio_mbm_init(struct csio_mbm *, struct csio_hw *, 251*4882a593Smuzhiyun void (*)(struct timer_list *)); 252*4882a593Smuzhiyun void csio_mbm_exit(struct csio_mbm *); 253*4882a593Smuzhiyun void csio_mb_intr_enable(struct csio_hw *); 254*4882a593Smuzhiyun void csio_mb_intr_disable(struct csio_hw *); 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun int csio_mb_issue(struct csio_hw *, struct csio_mb *); 257*4882a593Smuzhiyun void csio_mb_completions(struct csio_hw *, struct list_head *); 258*4882a593Smuzhiyun int csio_mb_fwevt_handler(struct csio_hw *, __be64 *); 259*4882a593Smuzhiyun int csio_mb_isr_handler(struct csio_hw *); 260*4882a593Smuzhiyun struct csio_mb *csio_mb_tmo_handler(struct csio_hw *); 261*4882a593Smuzhiyun void csio_mb_cancel_all(struct csio_hw *, struct list_head *); 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun #endif /* ifndef __CSIO_MB_H__ */ 264