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