/*
 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
 * All rights reserved
 * www.brocade.com
 *
 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License (GPL) Version 2 as
 * published by the Free Software Foundation
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 */

/**
 *  bfa_fcs_port.h BFA fcs port module public interface
 */

#ifndef __BFA_FCS_PORT_H__
#define __BFA_FCS_PORT_H__

#include <defs/bfa_defs_status.h>
#include <defs/bfa_defs_port.h>
#include <defs/bfa_defs_pport.h>
#include <defs/bfa_defs_rport.h>
#include <cs/bfa_q.h>
#include <bfa_svc.h>
#include <cs/bfa_wc.h>

struct bfa_fcs_s;
struct bfa_fcs_fabric_s;

/*
 * Maximum Rports supported per port (physical/logical).
 */
#define BFA_FCS_MAX_RPORTS_SUPP  256	/* @todo : tentative value */


struct bfa_fcs_port_ns_s {
	bfa_sm_t        sm;		/*  state machine */
	struct bfa_timer_s timer;
	struct bfa_fcs_port_s *port;	/*  parent port */
	struct bfa_fcxp_s *fcxp;
	struct bfa_fcxp_wqe_s fcxp_wqe;
};


struct bfa_fcs_port_scn_s {
	bfa_sm_t        sm;		/*  state machine */
	struct bfa_timer_s timer;
	struct bfa_fcs_port_s *port;	/*  parent port */
	struct bfa_fcxp_s *fcxp;
	struct bfa_fcxp_wqe_s fcxp_wqe;
};


struct bfa_fcs_port_fdmi_s {
	bfa_sm_t        sm;		/*  state machine */
	struct bfa_timer_s timer;
	struct bfa_fcs_port_ms_s *ms;	/*  parent ms */
	struct bfa_fcxp_s *fcxp;
	struct bfa_fcxp_wqe_s fcxp_wqe;
	u8         retry_cnt;	/*  retry count */
	u8	 	   rsvd[3];
};


struct bfa_fcs_port_ms_s {
	bfa_sm_t        sm;		/*  state machine */
	struct bfa_timer_s timer;
	struct bfa_fcs_port_s *port;	/*  parent port */
	struct bfa_fcxp_s *fcxp;
	struct bfa_fcxp_wqe_s fcxp_wqe;
	struct bfa_fcs_port_fdmi_s fdmi;	/*  FDMI component of MS */
	u8         retry_cnt;	/*  retry count */
	u8	 	   rsvd[3];
};


struct bfa_fcs_port_fab_s {
	struct bfa_fcs_port_ns_s ns;	/*  NS component of port */
	struct bfa_fcs_port_scn_s scn;	/*  scn component of port */
	struct bfa_fcs_port_ms_s ms;	/*  MS component of port */
};



#define 	MAX_ALPA_COUNT 		127

struct bfa_fcs_port_loop_s {
	u8         num_alpa;	/*  Num of ALPA entries in the map */
	u8         alpa_pos_map[MAX_ALPA_COUNT];	/*  ALPA Positional
							 *Map */
	struct bfa_fcs_port_s *port;	/*  parent port */
};



struct bfa_fcs_port_n2n_s {
	u32        rsvd;
	u16        reply_oxid;	/*  ox_id from the req flogi to be
					 *used in flogi acc */
	wwn_t           rem_port_wwn;	/*  Attached port's wwn */
};


union bfa_fcs_port_topo_u {
	struct bfa_fcs_port_fab_s pfab;
	struct bfa_fcs_port_loop_s ploop;
	struct bfa_fcs_port_n2n_s pn2n;
};


struct bfa_fcs_port_s {
	struct list_head         qe;	/*  used by port/vport */
	bfa_sm_t               sm;	/*  state machine */
	struct bfa_fcs_fabric_s *fabric;/*  parent fabric */
	struct bfa_port_cfg_s  port_cfg;/*  port configuration */
	struct bfa_timer_s link_timer;	/*  timer for link offline */
	u32 pid:24;	/*  FC address */
	u8  lp_tag;	/*  lport tag */
	u16 num_rports;	/*  Num of r-ports */
	struct list_head rport_q;	/*  queue of discovered r-ports */
	struct bfa_fcs_s *fcs;	/*  FCS instance */
	union bfa_fcs_port_topo_u port_topo;	/*  fabric/loop/n2n details */
	struct bfad_port_s *bfad_port;	/*  driver peer instance */
	struct bfa_fcs_vport_s *vport;	/*  NULL for base ports */
	struct bfa_fcxp_s *fcxp;
	struct bfa_fcxp_wqe_s fcxp_wqe;
	struct bfa_port_stats_s stats;
	struct bfa_wc_s        wc;	/*  waiting counter for events */
};

#define bfa_fcs_lport_t struct bfa_fcs_port_s

/**
 * Symbolic Name related defines
 *  Total bytes 255.
 *  Physical Port's symbolic name 128 bytes.
 *  For Vports, Vport's symbolic name is appended to the Physical port's
 *  Symbolic Name.
 *
 *  Physical Port's symbolic name Format : (Total 128 bytes)
 *  Adapter Model number/name : 12 bytes
 *  Driver Version     : 10 bytes
 *  Host Machine Name  : 30 bytes
 * 	Host OS Info	   : 48 bytes
 * 	Host OS PATCH Info : 16 bytes
 *  ( remaining 12 bytes reserved to be used for separator)
 */
#define BFA_FCS_PORT_SYMBNAME_SEPARATOR 		" | "

#define BFA_FCS_PORT_SYMBNAME_MODEL_SZ			12
#define BFA_FCS_PORT_SYMBNAME_VERSION_SZ 		10
#define BFA_FCS_PORT_SYMBNAME_MACHINENAME_SZ 	30
#define BFA_FCS_PORT_SYMBNAME_OSINFO_SZ			48
#define BFA_FCS_PORT_SYMBNAME_OSPATCH_SZ		16

/**
 * Get FC port ID for a logical port.
 */
#define bfa_fcs_port_get_fcid(_lport)	((_lport)->pid)
#define bfa_fcs_port_get_pwwn(_lport)	((_lport)->port_cfg.pwwn)
#define bfa_fcs_port_get_nwwn(_lport)	((_lport)->port_cfg.nwwn)
#define bfa_fcs_port_get_psym_name(_lport)	((_lport)->port_cfg.sym_name)
#define bfa_fcs_port_is_initiator(_lport)	\
			((_lport)->port_cfg.roles & BFA_PORT_ROLE_FCP_IM)
#define bfa_fcs_port_is_target(_lport)	\
			((_lport)->port_cfg.roles & BFA_PORT_ROLE_FCP_TM)
#define bfa_fcs_port_get_nrports(_lport)	\
			((_lport) ? (_lport)->num_rports : 0)

static inline struct bfad_port_s *
bfa_fcs_port_get_drvport(struct bfa_fcs_port_s *port)
{
	return port->bfad_port;
}


#define bfa_fcs_port_get_opertype(_lport)	((_lport)->fabric->oper_type)


#define bfa_fcs_port_get_fabric_name(_lport)	((_lport)->fabric->fabric_name)


#define bfa_fcs_port_get_fabric_ipaddr(_lport) \
		((_lport)->fabric->fabric_ip_addr)

/**
 * bfa fcs port public functions
 */
void bfa_fcs_cfg_base_port(struct bfa_fcs_s *fcs,
			struct bfa_port_cfg_s *port_cfg);
struct bfa_fcs_port_s *bfa_fcs_get_base_port(struct bfa_fcs_s *fcs);
void bfa_fcs_port_get_rports(struct bfa_fcs_port_s *port,
			wwn_t rport_wwns[], int *nrports);

wwn_t bfa_fcs_port_get_rport(struct bfa_fcs_port_s *port, wwn_t wwn,
			int index, int nrports, bfa_boolean_t bwwn);

struct bfa_fcs_port_s *bfa_fcs_lookup_port(struct bfa_fcs_s *fcs,
			u16 vf_id, wwn_t lpwwn);

void bfa_fcs_port_get_info(struct bfa_fcs_port_s *port,
			struct bfa_port_info_s *port_info);
void bfa_fcs_port_get_attr(struct bfa_fcs_port_s *port,
			struct bfa_port_attr_s *port_attr);
void bfa_fcs_port_get_stats(struct bfa_fcs_port_s *fcs_port,
			struct bfa_port_stats_s *port_stats);
void bfa_fcs_port_clear_stats(struct bfa_fcs_port_s *fcs_port);
enum bfa_pport_speed bfa_fcs_port_get_rport_max_speed(
			struct bfa_fcs_port_s *port);
void bfa_fcs_port_enable_ipfc_roles(struct bfa_fcs_port_s *fcs_port);
void bfa_fcs_port_disable_ipfc_roles(struct bfa_fcs_port_s *fcs_port);

#endif /* __BFA_FCS_PORT_H__ */
