17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved
47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com
57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter.
77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it
97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as
107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation
117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but
137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of
147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details.
167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h"
19a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs_svc.h"
20a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_port.h"
21a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfi.h"
22a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_ioc.h"
23a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(CNA, PORT);
267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
28a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_port_stats_swap(struct bfa_port_s *port, union bfa_port_stats_u *stats)
297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
30a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32    *dip = (u32 *) stats;
3150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie	__be32    t0, t1;
32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int	    i;
337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < sizeof(union bfa_port_stats_u)/sizeof(u32);
35a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		i += 2) {
367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		t0 = dip[i];
377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		t1 = dip[i + 1];
38f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#ifdef __BIG_ENDIAN
39ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		dip[i] = be32_to_cpu(t0);
40ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		dip[i + 1] = be32_to_cpu(t1);
417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#else
42ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		dip[i] = be32_to_cpu(t1);
43ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		dip[i + 1] = be32_to_cpu(t0);
447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#endif
457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_enable_isr()
507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port - Pointer to the port module
537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            status - Return status from the f/w
547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_enable_isr(struct bfa_port_s *port, bfa_status_t status)
597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
60a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(port, status);
61a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_pending = BFA_FALSE;
62a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbfn(port->endis_cbarg, status);
637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_disable_isr()
677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port - Pointer to the port module
707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            status - Return status from the f/w
717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_disable_isr(struct bfa_port_s *port, bfa_status_t status)
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
77a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(port, status);
78a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_pending = BFA_FALSE;
79a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbfn(port->endis_cbarg, status);
807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_get_stats_isr()
847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port - Pointer to the Port module
877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            status - Return status from the f/w
887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_get_stats_isr(struct bfa_port_s *port, bfa_status_t status)
937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_status = status;
957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_busy = BFA_FALSE;
967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (status == BFA_STATUS_OK) {
98f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang		struct timeval tv;
99b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		memcpy(port->stats, port->stats_dma.kva,
101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		       sizeof(union bfa_port_stats_u));
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_port_stats_swap(port, port->stats);
103b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
104f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang		do_gettimeofday(&tv);
105b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang		port->stats->fc.secs_reset = tv.tv_sec - port->stats_reset_time;
1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->stats_cbfn) {
1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		port->stats_cbfn(port->stats_cbarg, status);
1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		port->stats_cbfn = NULL;
1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_clear_stats_isr()
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port - Pointer to the Port module
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            status - Return status from the f/w
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_clear_stats_isr(struct bfa_port_s *port, bfa_status_t status)
1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
126f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	struct timeval tv;
127b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_status = status;
129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_busy   = BFA_FALSE;
1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1315fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	* re-initialize time stamp for stats reset
133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*/
134f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	do_gettimeofday(&tv);
135b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->stats_reset_time = tv.tv_sec;
136b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->stats_cbfn) {
1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		port->stats_cbfn(port->stats_cbarg, status);
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		port->stats_cbfn = NULL;
1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1435fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_isr()
1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_isr(void *cbarg, struct bfi_mbmsg_s *m)
1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_port_s *port = (struct bfa_port_s *) cbarg;
1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union bfi_port_i2h_msg_u *i2hmsg;
1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	i2hmsg = (union bfi_port_i2h_msg_u *) m;
1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(port, m->mh.msg_id);
1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (m->mh.msg_id) {
1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_PORT_I2H_ENABLE_RSP:
1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (port->endis_pending == BFA_FALSE)
1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_port_enable_isr(port, i2hmsg->enable_rsp.status);
1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_PORT_I2H_DISABLE_RSP:
1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (port->endis_pending == BFA_FALSE)
1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_port_disable_isr(port, i2hmsg->disable_rsp.status);
1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_PORT_I2H_GET_STATS_RSP:
174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/* Stats busy flag is still set? (may be cmd timed out) */
1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (port->stats_busy == BFA_FALSE)
1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_port_get_stats_isr(port, i2hmsg->getstats_rsp.status);
1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_PORT_I2H_CLEAR_STATS_RSP:
1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (port->stats_busy == BFA_FALSE)
1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_port_clear_stats_isr(port, i2hmsg->clearstats_rsp.status);
1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
187d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_meminfo()
1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] void
1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return Size of DMA region
1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32
2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_meminfo(void)
2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_ROUNDUP(sizeof(union bfa_port_stats_u), BFA_DMA_ALIGN_SZ);
2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_mem_claim()
2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port Port module pointer
210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	      dma_kva Kernel Virtual Address of Port DMA Memory
211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	      dma_pa  Physical Address of Port DMA Memory
2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_mem_claim(struct bfa_port_s *port, u8 *dma_kva, u64 dma_pa)
2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_dma.kva = dma_kva;
219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_dma.pa  = dma_pa;
2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_enable()
2247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *   Send the Port enable request to the f/w
2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return Status
2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_enable(struct bfa_port_s *port, bfa_port_endis_cbfn_t cbfn,
233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 void *cbarg)
2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_port_generic_req_s *m;
2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23743ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	/* If port is PBC disabled, return error */
23843ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	if (port->pbc_disabled) {
23943ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati		bfa_trc(port, BFA_STATUS_PBC);
24043ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati		return BFA_STATUS_PBC;
24143ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	}
24243ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati
243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_ioc_is_disabled(port->ioc)) {
244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(port, BFA_STATUS_IOC_DISABLED);
245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_IOC_DISABLED;
246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_is_operational(port->ioc)) {
2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_IOC_FAILURE);
2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_IOC_FAILURE;
2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->endis_pending) {
2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_DEVBUSY);
2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_DEVBUSY;
2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = (struct bfi_port_generic_req_s *) port->endis_mb.msg;
2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->msgtag++;
261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbfn    = cbfn;
262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbarg   = cbarg;
2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->endis_pending = BFA_TRUE;
2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(m->mh, BFI_MC_PORT, BFI_PORT_H2I_ENABLE_REQ,
2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(port->ioc));
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_queue(port->ioc, &port->endis_mb);
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_disable()
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *   Send the Port disable request to the f/w
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return Status
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_disable(struct bfa_port_s *port, bfa_port_endis_cbfn_t cbfn,
283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		  void *cbarg)
2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_port_generic_req_s *m;
2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
28743ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	/* If port is PBC disabled, return error */
28843ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	if (port->pbc_disabled) {
28943ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati		bfa_trc(port, BFA_STATUS_PBC);
29043ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati		return BFA_STATUS_PBC;
29143ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	}
29243ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati
293a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_ioc_is_disabled(port->ioc)) {
294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(port, BFA_STATUS_IOC_DISABLED);
295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_IOC_DISABLED;
296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_is_operational(port->ioc)) {
2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_IOC_FAILURE);
3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_IOC_FAILURE;
3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->endis_pending) {
3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_DEVBUSY);
3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_DEVBUSY;
3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = (struct bfi_port_generic_req_s *) port->endis_mb.msg;
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->msgtag++;
311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbfn    = cbfn;
312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->endis_cbarg   = cbarg;
3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->endis_pending = BFA_TRUE;
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(m->mh, BFI_MC_PORT, BFI_PORT_H2I_DISABLE_REQ,
3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(port->ioc));
3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_queue(port->ioc, &port->endis_mb);
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_get_stats()
3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *   Send the request to the f/w to fetch Port statistics.
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return Status
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_port_get_stats(struct bfa_port_s *port, union bfa_port_stats_u *stats,
333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    bfa_port_stats_cbfn_t cbfn, void *cbarg)
3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_port_get_stats_req_s *m;
3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_is_operational(port->ioc)) {
3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_IOC_FAILURE);
3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_IOC_FAILURE;
3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->stats_busy) {
3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_DEVBUSY);
3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_DEVBUSY;
3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = (struct bfi_port_get_stats_req_s *) port->stats_mb.msg;
3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats	  = stats;
350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_cbfn  = cbfn;
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_cbarg = cbarg;
352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_busy  = BFA_TRUE;
3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_dma_be_addr_set(m->dma_addr, port->stats_dma.pa);
3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(m->mh, BFI_MC_PORT, BFI_PORT_H2I_GET_STATS_REQ,
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(port->ioc));
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_queue(port->ioc, &port->stats_mb);
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3625fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_clear_stats()
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return Status
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_port_clear_stats(struct bfa_port_s *port, bfa_port_stats_cbfn_t cbfn,
372a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      void *cbarg)
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_port_generic_req_s *m;
3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_is_operational(port->ioc)) {
3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_IOC_FAILURE);
3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_IOC_FAILURE;
3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (port->stats_busy) {
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port, BFA_STATUS_DEVBUSY);
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_DEVBUSY;
3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = (struct bfi_port_generic_req_s *) port->stats_mb.msg;
3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_cbfn  = cbfn;
3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->stats_cbarg = cbarg;
390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->stats_busy  = BFA_TRUE;
3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(m->mh, BFI_MC_PORT, BFI_PORT_H2I_CLEAR_STATS_REQ,
3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(port->ioc));
3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_queue(port->ioc, &port->stats_mb);
3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
400d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati * bfa_port_notify()
4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
402d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati * Port module IOC event handler
4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] Pointer to the Port module data structure.
405d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati * @param[in] IOC event structure
4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
410d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatibfa_port_notify(void *arg, enum bfa_ioc_event_e event)
4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_port_s *port = (struct bfa_port_s *) arg;
4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
414d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	switch (event) {
415d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	case BFA_IOC_E_DISABLED:
416d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	case BFA_IOC_E_FAILED:
417d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		/* Fail any pending get_stats/clear_stats requests */
418d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		if (port->stats_busy) {
419d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			if (port->stats_cbfn)
420d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati				port->stats_cbfn(port->stats_cbarg,
421d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati						BFA_STATUS_FAILED);
422d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			port->stats_cbfn = NULL;
423d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			port->stats_busy = BFA_FALSE;
424d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		}
425d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati
426d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		/* Clear any enable/disable is pending */
427d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		if (port->endis_pending) {
428d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			if (port->endis_cbfn)
429d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati				port->endis_cbfn(port->endis_cbarg,
430d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati						BFA_STATUS_FAILED);
431d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			port->endis_cbfn = NULL;
432d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati			port->endis_pending = BFA_FALSE;
433d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		}
434d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		break;
435d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	default:
436d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		break;
4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_port_attach()
4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] port - Pointer to the Port module data structure
4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            ioc  - Pointer to the ioc module data structure
4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            dev  - Pointer to the device driver module data structure
4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *                   The device driver specific mbox ISR functions have
4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *                   this pointer as one of the parameters.
4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *            trcmod -
4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc,
455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 void *dev, struct bfa_trc_mod_s *trcmod)
4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
457f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	struct timeval tv;
458b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
459d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!port);
4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->dev    = dev;
462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	port->ioc    = ioc;
4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	port->trcmod = trcmod;
4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
465b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->stats_busy = BFA_FALSE;
466b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->endis_pending = BFA_FALSE;
467b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->stats_cbfn = NULL;
468b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->endis_cbfn = NULL;
46943ffdf4dfb827babcdca5345a76031598a985dc8Krishna Gudipati	port->pbc_disabled = BFA_FALSE;
4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_regisr(port->ioc, BFI_MC_PORT, bfa_port_isr, port);
4723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_q_qe_init(&port->ioc_notify);
473d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_notify_init(&port->ioc_notify, bfa_port_notify, port);
474d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	list_add_tail(&port->ioc_notify.qe, &port->ioc->notify_q);
4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4765fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
477b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	 * initialize time stamp for stats reset
478b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	 */
479f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	do_gettimeofday(&tv);
480b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang	port->stats_reset_time = tv.tv_sec;
481b85d045ee866011df535565bf12d684e8e5b7a9dJing Huang
4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(port, 0);
4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
484148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
485148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
486148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *	CEE module specific definitions
487148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
488148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
489148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
490148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_get_attr_isr()
491148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
492148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief CEE ISR for get-attributes responses from f/w
493148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
494148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] cee - Pointer to the CEE module
495148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *		    status - Return status from the f/w
496148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
497148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
498148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
499148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatistatic void
500148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_get_attr_isr(struct bfa_cee_s *cee, bfa_status_t status)
501148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
502148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_cee_lldp_cfg_s *lldp_cfg = &cee->attr->lldp_remote;
503148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
504148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_attr_status = status;
505148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, 0);
506148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (status == BFA_STATUS_OK) {
507148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
508148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		memcpy(cee->attr, cee->attr_dma.kva,
509148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_attr_s));
510148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		lldp_cfg->time_to_live = be16_to_cpu(lldp_cfg->time_to_live);
511148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		lldp_cfg->enabled_system_cap =
512148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				be16_to_cpu(lldp_cfg->enabled_system_cap);
513148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
514148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_attr_pending = BFA_FALSE;
515148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->cbfn.get_attr_cbfn) {
516148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
517148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		cee->cbfn.get_attr_cbfn(cee->cbfn.get_attr_cbarg, status);
518148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
519148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
520148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
521148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
522148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_get_stats_isr()
523148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
524148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief CEE ISR for get-stats responses from f/w
525148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
526148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] cee - Pointer to the CEE module
527148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *	      status - Return status from the f/w
528148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
529148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
530148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
531148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatistatic void
532148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_get_stats_isr(struct bfa_cee_s *cee, bfa_status_t status)
533148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
534148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	u32 *buffer;
535148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	int i;
536148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
537148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_stats_status = status;
538148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, 0);
539148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (status == BFA_STATUS_OK) {
540148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
541148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		memcpy(cee->stats, cee->stats_dma.kva,
542148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_stats_s));
543148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		/* swap the cee stats */
544148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		buffer = (u32 *)cee->stats;
545148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		for (i = 0; i < (sizeof(struct bfa_cee_stats_s) /
546148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				 sizeof(u32)); i++)
547148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			buffer[i] = cpu_to_be32(buffer[i]);
548148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
549148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_stats_pending = BFA_FALSE;
550148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, 0);
551148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->cbfn.get_stats_cbfn) {
552148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
553148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		cee->cbfn.get_stats_cbfn(cee->cbfn.get_stats_cbarg, status);
554148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
555148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
556148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
557148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
558148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_reset_stats_isr()
559148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
560148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief CEE ISR for reset-stats responses from f/w
561148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
562148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] cee - Pointer to the CEE module
563148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *            status - Return status from the f/w
564148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
565148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
566148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
567148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatistatic void
568148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_reset_stats_isr(struct bfa_cee_s *cee, bfa_status_t status)
569148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
570148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->reset_stats_status = status;
571148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->reset_stats_pending = BFA_FALSE;
572148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->cbfn.reset_stats_cbfn)
573148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		cee->cbfn.reset_stats_cbfn(cee->cbfn.reset_stats_cbarg, status);
574148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
575148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
576148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
577148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_meminfo()
578148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
579148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief Returns the size of the DMA memory needed by CEE module
580148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
581148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] void
582148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
583148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return Size of DMA region
584148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
585148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiu32
586148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_meminfo(void)
587148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
588148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return BFA_ROUNDUP(sizeof(struct bfa_cee_attr_s), BFA_DMA_ALIGN_SZ) +
589148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		BFA_ROUNDUP(sizeof(struct bfa_cee_stats_s), BFA_DMA_ALIGN_SZ);
590148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
591148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
592148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
593148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_mem_claim()
594148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
595148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief Initialized CEE DMA Memory
596148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
597148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] cee CEE module pointer
598148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *            dma_kva Kernel Virtual Address of CEE DMA Memory
599148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *            dma_pa  Physical Address of CEE DMA Memory
600148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
601148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
602148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
603148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipativoid
604148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_mem_claim(struct bfa_cee_s *cee, u8 *dma_kva, u64 dma_pa)
605148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
606148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->attr_dma.kva = dma_kva;
607148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->attr_dma.pa = dma_pa;
608148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->stats_dma.kva = dma_kva + BFA_ROUNDUP(
609148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			     sizeof(struct bfa_cee_attr_s), BFA_DMA_ALIGN_SZ);
610148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->stats_dma.pa = dma_pa + BFA_ROUNDUP(
611148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			     sizeof(struct bfa_cee_attr_s), BFA_DMA_ALIGN_SZ);
612148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->attr = (struct bfa_cee_attr_s *) dma_kva;
613148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->stats = (struct bfa_cee_stats_s *) (dma_kva + BFA_ROUNDUP(
614148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_attr_s), BFA_DMA_ALIGN_SZ));
615148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
616148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
617148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
618148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_get_attr()
619148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
620148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief
621148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *   Send the request to the f/w to fetch CEE attributes.
622148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
623148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] Pointer to the CEE module data structure.
624148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
625148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return Status
626148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
627148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
628148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_status_t
629148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_get_attr(struct bfa_cee_s *cee, struct bfa_cee_attr_s *attr,
630148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		 bfa_cee_get_attr_cbfn_t cbfn, void *cbarg)
631148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
632148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfi_cee_get_req_s *cmd;
633148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
634148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	WARN_ON((cee == NULL) || (cee->ioc == NULL));
635148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, 0);
636148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (!bfa_ioc_is_operational(cee->ioc)) {
637148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
638148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return BFA_STATUS_IOC_FAILURE;
639148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
640148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->get_attr_pending == BFA_TRUE) {
641148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
642148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return  BFA_STATUS_DEVBUSY;
643148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
644148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_attr_pending = BFA_TRUE;
645148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cmd = (struct bfi_cee_get_req_s *) cee->get_cfg_mb.msg;
646148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->attr = attr;
647148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.get_attr_cbfn = cbfn;
648148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.get_attr_cbarg = cbarg;
649148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfi_h2i_set(cmd->mh, BFI_MC_CEE, BFI_CEE_H2I_GET_CFG_REQ,
650148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_ioc_portid(cee->ioc));
651148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_dma_be_addr_set(cmd->dma_addr, cee->attr_dma.pa);
652148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_ioc_mbox_queue(cee->ioc, &cee->get_cfg_mb);
653148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
654148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return BFA_STATUS_OK;
655148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
656148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
657148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
658148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_get_stats()
659148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
660148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief
661148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *   Send the request to the f/w to fetch CEE statistics.
662148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
663148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] Pointer to the CEE module data structure.
664148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
665148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return Status
666148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
667148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
668148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_status_t
669148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_get_stats(struct bfa_cee_s *cee, struct bfa_cee_stats_s *stats,
670148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		  bfa_cee_get_stats_cbfn_t cbfn, void *cbarg)
671148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
672148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfi_cee_get_req_s *cmd;
673148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
674148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	WARN_ON((cee == NULL) || (cee->ioc == NULL));
675148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
676148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (!bfa_ioc_is_operational(cee->ioc)) {
677148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
678148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return BFA_STATUS_IOC_FAILURE;
679148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
680148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->get_stats_pending == BFA_TRUE) {
681148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
682148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return  BFA_STATUS_DEVBUSY;
683148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
684148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->get_stats_pending = BFA_TRUE;
685148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cmd = (struct bfi_cee_get_req_s *) cee->get_stats_mb.msg;
686148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->stats = stats;
687148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.get_stats_cbfn = cbfn;
688148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.get_stats_cbarg = cbarg;
689148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfi_h2i_set(cmd->mh, BFI_MC_CEE, BFI_CEE_H2I_GET_STATS_REQ,
690148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_ioc_portid(cee->ioc));
691148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_dma_be_addr_set(cmd->dma_addr, cee->stats_dma.pa);
692148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_ioc_mbox_queue(cee->ioc, &cee->get_stats_mb);
693148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
694148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return BFA_STATUS_OK;
695148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
696148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
697148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
698148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_reset_stats()
699148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
700148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief Clears CEE Stats in the f/w.
701148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
702148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] Pointer to the CEE module data structure.
703148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
704148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return Status
705148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
706148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
707148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_status_t
708148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_reset_stats(struct bfa_cee_s *cee,
709148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		    bfa_cee_reset_stats_cbfn_t cbfn, void *cbarg)
710148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
711148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfi_cee_reset_stats_s *cmd;
712148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
713148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	WARN_ON((cee == NULL) || (cee->ioc == NULL));
714148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (!bfa_ioc_is_operational(cee->ioc)) {
715148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
716148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return BFA_STATUS_IOC_FAILURE;
717148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
718148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (cee->reset_stats_pending == BFA_TRUE) {
719148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, 0);
720148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return  BFA_STATUS_DEVBUSY;
721148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
722148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->reset_stats_pending = BFA_TRUE;
723148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cmd = (struct bfi_cee_reset_stats_s *) cee->reset_stats_mb.msg;
724148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.reset_stats_cbfn = cbfn;
725148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->cbfn.reset_stats_cbarg = cbarg;
726148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfi_h2i_set(cmd->mh, BFI_MC_CEE, BFI_CEE_H2I_RESET_STATS,
727148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_ioc_portid(cee->ioc));
728148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_ioc_mbox_queue(cee->ioc, &cee->reset_stats_mb);
729148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
730148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return BFA_STATUS_OK;
731148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
732148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
733148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
734148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_isrs()
735148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
736148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief Handles Mail-box interrupts for CEE module.
737148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
738148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] Pointer to the CEE module data structure.
739148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
740148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
741148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
742148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
743148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipativoid
744148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_isr(void *cbarg, struct bfi_mbmsg_s *m)
745148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
746148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	union bfi_cee_i2h_msg_u *msg;
747148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfi_cee_get_rsp_s *get_rsp;
748148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_cee_s *cee = (struct bfa_cee_s *) cbarg;
749148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	msg = (union bfi_cee_i2h_msg_u *) m;
750148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	get_rsp = (struct bfi_cee_get_rsp_s *) m;
751148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, msg->mh.msg_id);
752148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	switch (msg->mh.msg_id) {
753148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case BFI_CEE_I2H_GET_CFG_RSP:
754148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(cee, get_rsp->cmd_status);
755148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_cee_get_attr_isr(cee, get_rsp->cmd_status);
756148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
757148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case BFI_CEE_I2H_GET_STATS_RSP:
758148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_cee_get_stats_isr(cee, get_rsp->cmd_status);
759148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
760148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case BFI_CEE_I2H_RESET_STATS_RSP:
761148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_cee_reset_stats_isr(cee, get_rsp->cmd_status);
762148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
763148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	default:
764148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		WARN_ON(1);
765148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
766148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
767148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
768148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
769148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_notify()
770148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
771148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief CEE module IOC event handler.
772148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
773148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] Pointer to the CEE module data structure.
774148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] IOC event type
775148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
776148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
777148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
778148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
779148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipativoid
780148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_notify(void *arg, enum bfa_ioc_event_e event)
781148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
782148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_cee_s *cee = (struct bfa_cee_s *) arg;
783148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
784148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_trc(cee, event);
785148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
786148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	switch (event) {
787148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case BFA_IOC_E_DISABLED:
788148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case BFA_IOC_E_FAILED:
789148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		if (cee->get_attr_pending == BFA_TRUE) {
790148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->get_attr_status = BFA_STATUS_FAILED;
791148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->get_attr_pending  = BFA_FALSE;
792148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			if (cee->cbfn.get_attr_cbfn) {
793148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				cee->cbfn.get_attr_cbfn(
794148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					cee->cbfn.get_attr_cbarg,
795148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					BFA_STATUS_FAILED);
796148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			}
797148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		}
798148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		if (cee->get_stats_pending == BFA_TRUE) {
799148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->get_stats_status = BFA_STATUS_FAILED;
800148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->get_stats_pending  = BFA_FALSE;
801148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			if (cee->cbfn.get_stats_cbfn) {
802148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				cee->cbfn.get_stats_cbfn(
803148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				cee->cbfn.get_stats_cbarg,
804148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				BFA_STATUS_FAILED);
805148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			}
806148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		}
807148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		if (cee->reset_stats_pending == BFA_TRUE) {
808148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->reset_stats_status = BFA_STATUS_FAILED;
809148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			cee->reset_stats_pending  = BFA_FALSE;
810148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			if (cee->cbfn.reset_stats_cbfn) {
811148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				cee->cbfn.reset_stats_cbfn(
812148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				cee->cbfn.reset_stats_cbarg,
813148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				BFA_STATUS_FAILED);
814148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			}
815148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		}
816148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
817148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
818148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	default:
819148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
820148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
821148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
822148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
823148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati/*
824148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * bfa_cee_attach()
825148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
826148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @brief CEE module-attach API
827148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
828148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @param[in] cee - Pointer to the CEE module data structure
829148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *            ioc - Pointer to the ioc module data structure
830148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *            dev - Pointer to the device driver module data structure
831148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *                  The device driver specific mbox ISR functions have
832148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *                  this pointer as one of the parameters.
833148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati *
834148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati * @return void
835148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati */
836148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipativoid
837148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_cee_attach(struct bfa_cee_s *cee, struct bfa_ioc_s *ioc,
838148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		void *dev)
839148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
840148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	WARN_ON(cee == NULL);
841148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->dev = dev;
842148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->ioc = ioc;
843148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
844148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_ioc_mbox_regisr(cee->ioc, BFI_MC_CEE, bfa_cee_isr, cee);
845148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_q_qe_init(&cee->ioc_notify);
846148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_ioc_notify_init(&cee->ioc_notify, bfa_cee_notify, cee);
847148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	list_add_tail(&cee->ioc_notify.qe, &cee->ioc->notify_q);
848148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
849