1fe56b9e6SYuval Mintz /* QLogic qed NIC Driver 2fe56b9e6SYuval Mintz * Copyright (c) 2015 QLogic Corporation 3fe56b9e6SYuval Mintz * 4fe56b9e6SYuval Mintz * This software is available under the terms of the GNU General Public License 5fe56b9e6SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 6fe56b9e6SYuval Mintz * this source tree. 7fe56b9e6SYuval Mintz */ 8fe56b9e6SYuval Mintz 9fe56b9e6SYuval Mintz #ifndef _QED_MCP_H 10fe56b9e6SYuval Mintz #define _QED_MCP_H 11fe56b9e6SYuval Mintz 12fe56b9e6SYuval Mintz #include <linux/types.h> 13fe56b9e6SYuval Mintz #include <linux/delay.h> 14fe56b9e6SYuval Mintz #include <linux/slab.h> 155529bad9STomer Tayar #include <linux/spinlock.h> 16fe56b9e6SYuval Mintz #include "qed_hsi.h" 17fe56b9e6SYuval Mintz 18cc875c2eSYuval Mintz struct qed_mcp_link_speed_params { 19cc875c2eSYuval Mintz bool autoneg; 20cc875c2eSYuval Mintz u32 advertised_speeds; /* bitmask of DRV_SPEED_CAPABILITY */ 21cc875c2eSYuval Mintz u32 forced_speed; /* In Mb/s */ 22cc875c2eSYuval Mintz }; 23cc875c2eSYuval Mintz 24cc875c2eSYuval Mintz struct qed_mcp_link_pause_params { 25cc875c2eSYuval Mintz bool autoneg; 26cc875c2eSYuval Mintz bool forced_rx; 27cc875c2eSYuval Mintz bool forced_tx; 28cc875c2eSYuval Mintz }; 29cc875c2eSYuval Mintz 30cc875c2eSYuval Mintz struct qed_mcp_link_params { 31cc875c2eSYuval Mintz struct qed_mcp_link_speed_params speed; 32cc875c2eSYuval Mintz struct qed_mcp_link_pause_params pause; 33cc875c2eSYuval Mintz u32 loopback_mode; 34cc875c2eSYuval Mintz }; 35cc875c2eSYuval Mintz 36cc875c2eSYuval Mintz struct qed_mcp_link_capabilities { 37cc875c2eSYuval Mintz u32 speed_capabilities; 38cc875c2eSYuval Mintz }; 39cc875c2eSYuval Mintz 40cc875c2eSYuval Mintz struct qed_mcp_link_state { 41cc875c2eSYuval Mintz bool link_up; 42cc875c2eSYuval Mintz 43a64b02d5SManish Chopra u32 min_pf_rate; 44a64b02d5SManish Chopra 454b01e519SManish Chopra /* Actual link speed in Mb/s */ 464b01e519SManish Chopra u32 line_speed; 474b01e519SManish Chopra 484b01e519SManish Chopra /* PF max speed in Mb/s, deduced from line_speed 494b01e519SManish Chopra * according to PF max bandwidth configuration. 504b01e519SManish Chopra */ 514b01e519SManish Chopra u32 speed; 52cc875c2eSYuval Mintz bool full_duplex; 53cc875c2eSYuval Mintz 54cc875c2eSYuval Mintz bool an; 55cc875c2eSYuval Mintz bool an_complete; 56cc875c2eSYuval Mintz bool parallel_detection; 57cc875c2eSYuval Mintz bool pfc_enabled; 58cc875c2eSYuval Mintz 59cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_1G_HD BIT(0) 60cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_1G_FD BIT(1) 61cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_10G BIT(2) 62cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_20G BIT(3) 63054c67d1SSudarsana Reddy Kalluru #define QED_LINK_PARTNER_SPEED_25G BIT(4) 64054c67d1SSudarsana Reddy Kalluru #define QED_LINK_PARTNER_SPEED_40G BIT(5) 65054c67d1SSudarsana Reddy Kalluru #define QED_LINK_PARTNER_SPEED_50G BIT(6) 66054c67d1SSudarsana Reddy Kalluru #define QED_LINK_PARTNER_SPEED_100G BIT(7) 67cc875c2eSYuval Mintz u32 partner_adv_speed; 68cc875c2eSYuval Mintz 69cc875c2eSYuval Mintz bool partner_tx_flow_ctrl_en; 70cc875c2eSYuval Mintz bool partner_rx_flow_ctrl_en; 71cc875c2eSYuval Mintz 72cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SYMMETRIC_PAUSE (1) 73cc875c2eSYuval Mintz #define QED_LINK_PARTNER_ASYMMETRIC_PAUSE (2) 74cc875c2eSYuval Mintz #define QED_LINK_PARTNER_BOTH_PAUSE (3) 75cc875c2eSYuval Mintz u8 partner_adv_pause; 76cc875c2eSYuval Mintz 77cc875c2eSYuval Mintz bool sfp_tx_fault; 78cc875c2eSYuval Mintz }; 79cc875c2eSYuval Mintz 80fe56b9e6SYuval Mintz struct qed_mcp_function_info { 81fe56b9e6SYuval Mintz u8 pause_on_host; 82fe56b9e6SYuval Mintz 83fe56b9e6SYuval Mintz enum qed_pci_personality protocol; 84fe56b9e6SYuval Mintz 85fe56b9e6SYuval Mintz u8 bandwidth_min; 86fe56b9e6SYuval Mintz u8 bandwidth_max; 87fe56b9e6SYuval Mintz 88fe56b9e6SYuval Mintz u8 mac[ETH_ALEN]; 89fe56b9e6SYuval Mintz 90fe56b9e6SYuval Mintz u64 wwn_port; 91fe56b9e6SYuval Mintz u64 wwn_node; 92fe56b9e6SYuval Mintz 93fe56b9e6SYuval Mintz #define QED_MCP_VLAN_UNSET (0xffff) 94fe56b9e6SYuval Mintz u16 ovlan; 95fe56b9e6SYuval Mintz }; 96fe56b9e6SYuval Mintz 97fe56b9e6SYuval Mintz struct qed_mcp_nvm_common { 98fe56b9e6SYuval Mintz u32 offset; 99fe56b9e6SYuval Mintz u32 param; 100fe56b9e6SYuval Mintz u32 resp; 101fe56b9e6SYuval Mintz u32 cmd; 102fe56b9e6SYuval Mintz }; 103fe56b9e6SYuval Mintz 104fe56b9e6SYuval Mintz struct qed_mcp_drv_version { 105fe56b9e6SYuval Mintz u32 version; 106fe56b9e6SYuval Mintz u8 name[MCP_DRV_VER_STR_SIZE - 4]; 107fe56b9e6SYuval Mintz }; 108fe56b9e6SYuval Mintz 1096c754246SSudarsana Reddy Kalluru struct qed_mcp_lan_stats { 1106c754246SSudarsana Reddy Kalluru u64 ucast_rx_pkts; 1116c754246SSudarsana Reddy Kalluru u64 ucast_tx_pkts; 1126c754246SSudarsana Reddy Kalluru u32 fcs_err; 1136c754246SSudarsana Reddy Kalluru }; 1146c754246SSudarsana Reddy Kalluru 1156c754246SSudarsana Reddy Kalluru struct qed_mcp_fcoe_stats { 1166c754246SSudarsana Reddy Kalluru u64 rx_pkts; 1176c754246SSudarsana Reddy Kalluru u64 tx_pkts; 1186c754246SSudarsana Reddy Kalluru u32 fcs_err; 1196c754246SSudarsana Reddy Kalluru u32 login_failure; 1206c754246SSudarsana Reddy Kalluru }; 1216c754246SSudarsana Reddy Kalluru 1226c754246SSudarsana Reddy Kalluru struct qed_mcp_iscsi_stats { 1236c754246SSudarsana Reddy Kalluru u64 rx_pdus; 1246c754246SSudarsana Reddy Kalluru u64 tx_pdus; 1256c754246SSudarsana Reddy Kalluru u64 rx_bytes; 1266c754246SSudarsana Reddy Kalluru u64 tx_bytes; 1276c754246SSudarsana Reddy Kalluru }; 1286c754246SSudarsana Reddy Kalluru 1296c754246SSudarsana Reddy Kalluru struct qed_mcp_rdma_stats { 1306c754246SSudarsana Reddy Kalluru u64 rx_pkts; 1316c754246SSudarsana Reddy Kalluru u64 tx_pkts; 1326c754246SSudarsana Reddy Kalluru u64 rx_bytes; 1336c754246SSudarsana Reddy Kalluru u64 tx_byts; 1346c754246SSudarsana Reddy Kalluru }; 1356c754246SSudarsana Reddy Kalluru 1366c754246SSudarsana Reddy Kalluru enum qed_mcp_protocol_type { 1376c754246SSudarsana Reddy Kalluru QED_MCP_LAN_STATS, 1386c754246SSudarsana Reddy Kalluru QED_MCP_FCOE_STATS, 1396c754246SSudarsana Reddy Kalluru QED_MCP_ISCSI_STATS, 1406c754246SSudarsana Reddy Kalluru QED_MCP_RDMA_STATS 1416c754246SSudarsana Reddy Kalluru }; 1426c754246SSudarsana Reddy Kalluru 1436c754246SSudarsana Reddy Kalluru union qed_mcp_protocol_stats { 1446c754246SSudarsana Reddy Kalluru struct qed_mcp_lan_stats lan_stats; 1456c754246SSudarsana Reddy Kalluru struct qed_mcp_fcoe_stats fcoe_stats; 1466c754246SSudarsana Reddy Kalluru struct qed_mcp_iscsi_stats iscsi_stats; 1476c754246SSudarsana Reddy Kalluru struct qed_mcp_rdma_stats rdma_stats; 1486c754246SSudarsana Reddy Kalluru }; 1496c754246SSudarsana Reddy Kalluru 150fe56b9e6SYuval Mintz /** 151cc875c2eSYuval Mintz * @brief - returns the link params of the hw function 152cc875c2eSYuval Mintz * 153cc875c2eSYuval Mintz * @param p_hwfn 154cc875c2eSYuval Mintz * 155cc875c2eSYuval Mintz * @returns pointer to link params 156cc875c2eSYuval Mintz */ 157cc875c2eSYuval Mintz struct qed_mcp_link_params *qed_mcp_get_link_params(struct qed_hwfn *); 158cc875c2eSYuval Mintz 159cc875c2eSYuval Mintz /** 160cc875c2eSYuval Mintz * @brief - return the link state of the hw function 161cc875c2eSYuval Mintz * 162cc875c2eSYuval Mintz * @param p_hwfn 163cc875c2eSYuval Mintz * 164cc875c2eSYuval Mintz * @returns pointer to link state 165cc875c2eSYuval Mintz */ 166cc875c2eSYuval Mintz struct qed_mcp_link_state *qed_mcp_get_link_state(struct qed_hwfn *); 167cc875c2eSYuval Mintz 168cc875c2eSYuval Mintz /** 169cc875c2eSYuval Mintz * @brief - return the link capabilities of the hw function 170cc875c2eSYuval Mintz * 171cc875c2eSYuval Mintz * @param p_hwfn 172cc875c2eSYuval Mintz * 173cc875c2eSYuval Mintz * @returns pointer to link capabilities 174cc875c2eSYuval Mintz */ 175cc875c2eSYuval Mintz struct qed_mcp_link_capabilities 176cc875c2eSYuval Mintz *qed_mcp_get_link_capabilities(struct qed_hwfn *p_hwfn); 177cc875c2eSYuval Mintz 178cc875c2eSYuval Mintz /** 179cc875c2eSYuval Mintz * @brief Request the MFW to set the the link according to 'link_input'. 180cc875c2eSYuval Mintz * 181cc875c2eSYuval Mintz * @param p_hwfn 182cc875c2eSYuval Mintz * @param p_ptt 183cc875c2eSYuval Mintz * @param b_up - raise link if `true'. Reset link if `false'. 184cc875c2eSYuval Mintz * 185cc875c2eSYuval Mintz * @return int 186cc875c2eSYuval Mintz */ 187cc875c2eSYuval Mintz int qed_mcp_set_link(struct qed_hwfn *p_hwfn, 188cc875c2eSYuval Mintz struct qed_ptt *p_ptt, 189cc875c2eSYuval Mintz bool b_up); 190cc875c2eSYuval Mintz 191cc875c2eSYuval Mintz /** 192fe56b9e6SYuval Mintz * @brief Get the management firmware version value 193fe56b9e6SYuval Mintz * 1941408cc1fSYuval Mintz * @param p_hwfn 1951408cc1fSYuval Mintz * @param p_ptt 1961408cc1fSYuval Mintz * @param p_mfw_ver - mfw version value 1971408cc1fSYuval Mintz * @param p_running_bundle_id - image id in nvram; Optional. 198fe56b9e6SYuval Mintz * 1991408cc1fSYuval Mintz * @return int - 0 - operation was successful. 200fe56b9e6SYuval Mintz */ 2011408cc1fSYuval Mintz int qed_mcp_get_mfw_ver(struct qed_hwfn *p_hwfn, 2021408cc1fSYuval Mintz struct qed_ptt *p_ptt, 2031408cc1fSYuval Mintz u32 *p_mfw_ver, u32 *p_running_bundle_id); 204fe56b9e6SYuval Mintz 205fe56b9e6SYuval Mintz /** 206cc875c2eSYuval Mintz * @brief Get media type value of the port. 207cc875c2eSYuval Mintz * 208cc875c2eSYuval Mintz * @param cdev - qed dev pointer 209cc875c2eSYuval Mintz * @param mfw_ver - media type value 210cc875c2eSYuval Mintz * 211cc875c2eSYuval Mintz * @return int - 212cc875c2eSYuval Mintz * 0 - Operation was successul. 213cc875c2eSYuval Mintz * -EBUSY - Operation failed 214cc875c2eSYuval Mintz */ 215cc875c2eSYuval Mintz int qed_mcp_get_media_type(struct qed_dev *cdev, 216cc875c2eSYuval Mintz u32 *media_type); 217cc875c2eSYuval Mintz 218cc875c2eSYuval Mintz /** 219fe56b9e6SYuval Mintz * @brief General function for sending commands to the MCP 220fe56b9e6SYuval Mintz * mailbox. It acquire mutex lock for the entire 221fe56b9e6SYuval Mintz * operation, from sending the request until the MCP 222fe56b9e6SYuval Mintz * response. Waiting for MCP response will be checked up 223fe56b9e6SYuval Mintz * to 5 seconds every 5ms. 224fe56b9e6SYuval Mintz * 225fe56b9e6SYuval Mintz * @param p_hwfn - hw function 226fe56b9e6SYuval Mintz * @param p_ptt - PTT required for register access 227fe56b9e6SYuval Mintz * @param cmd - command to be sent to the MCP. 228fe56b9e6SYuval Mintz * @param param - Optional param 229fe56b9e6SYuval Mintz * @param o_mcp_resp - The MCP response code (exclude sequence). 230fe56b9e6SYuval Mintz * @param o_mcp_param- Optional parameter provided by the MCP 231fe56b9e6SYuval Mintz * response 232fe56b9e6SYuval Mintz * @return int - 0 - operation 233fe56b9e6SYuval Mintz * was successul. 234fe56b9e6SYuval Mintz */ 235fe56b9e6SYuval Mintz int qed_mcp_cmd(struct qed_hwfn *p_hwfn, 236fe56b9e6SYuval Mintz struct qed_ptt *p_ptt, 237fe56b9e6SYuval Mintz u32 cmd, 238fe56b9e6SYuval Mintz u32 param, 239fe56b9e6SYuval Mintz u32 *o_mcp_resp, 240fe56b9e6SYuval Mintz u32 *o_mcp_param); 241fe56b9e6SYuval Mintz 242fe56b9e6SYuval Mintz /** 243fe56b9e6SYuval Mintz * @brief - drains the nig, allowing completion to pass in case of pauses. 244fe56b9e6SYuval Mintz * (Should be called only from sleepable context) 245fe56b9e6SYuval Mintz * 246fe56b9e6SYuval Mintz * @param p_hwfn 247fe56b9e6SYuval Mintz * @param p_ptt 248fe56b9e6SYuval Mintz */ 249fe56b9e6SYuval Mintz int qed_mcp_drain(struct qed_hwfn *p_hwfn, 250fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 251fe56b9e6SYuval Mintz 252fe56b9e6SYuval Mintz /** 253cee4d264SManish Chopra * @brief Get the flash size value 254cee4d264SManish Chopra * 255cee4d264SManish Chopra * @param p_hwfn 256cee4d264SManish Chopra * @param p_ptt 257cee4d264SManish Chopra * @param p_flash_size - flash size in bytes to be filled. 258cee4d264SManish Chopra * 259cee4d264SManish Chopra * @return int - 0 - operation was successul. 260cee4d264SManish Chopra */ 261cee4d264SManish Chopra int qed_mcp_get_flash_size(struct qed_hwfn *p_hwfn, 262cee4d264SManish Chopra struct qed_ptt *p_ptt, 263cee4d264SManish Chopra u32 *p_flash_size); 264cee4d264SManish Chopra 265cee4d264SManish Chopra /** 266fe56b9e6SYuval Mintz * @brief Send driver version to MFW 267fe56b9e6SYuval Mintz * 268fe56b9e6SYuval Mintz * @param p_hwfn 269fe56b9e6SYuval Mintz * @param p_ptt 270fe56b9e6SYuval Mintz * @param version - Version value 271fe56b9e6SYuval Mintz * @param name - Protocol driver name 272fe56b9e6SYuval Mintz * 273fe56b9e6SYuval Mintz * @return int - 0 - operation was successul. 274fe56b9e6SYuval Mintz */ 275fe56b9e6SYuval Mintz int 276fe56b9e6SYuval Mintz qed_mcp_send_drv_version(struct qed_hwfn *p_hwfn, 277fe56b9e6SYuval Mintz struct qed_ptt *p_ptt, 278fe56b9e6SYuval Mintz struct qed_mcp_drv_version *p_ver); 279fe56b9e6SYuval Mintz 28091420b83SSudarsana Kalluru /** 28191420b83SSudarsana Kalluru * @brief Set LED status 28291420b83SSudarsana Kalluru * 28391420b83SSudarsana Kalluru * @param p_hwfn 28491420b83SSudarsana Kalluru * @param p_ptt 28591420b83SSudarsana Kalluru * @param mode - LED mode 28691420b83SSudarsana Kalluru * 28791420b83SSudarsana Kalluru * @return int - 0 - operation was successful. 28891420b83SSudarsana Kalluru */ 28991420b83SSudarsana Kalluru int qed_mcp_set_led(struct qed_hwfn *p_hwfn, 29091420b83SSudarsana Kalluru struct qed_ptt *p_ptt, 29191420b83SSudarsana Kalluru enum qed_led_mode mode); 29291420b83SSudarsana Kalluru 29303dc76caSSudarsana Reddy Kalluru /** 29403dc76caSSudarsana Reddy Kalluru * @brief Bist register test 29503dc76caSSudarsana Reddy Kalluru * 29603dc76caSSudarsana Reddy Kalluru * @param p_hwfn - hw function 29703dc76caSSudarsana Reddy Kalluru * @param p_ptt - PTT required for register access 29803dc76caSSudarsana Reddy Kalluru * 29903dc76caSSudarsana Reddy Kalluru * @return int - 0 - operation was successful. 30003dc76caSSudarsana Reddy Kalluru */ 30103dc76caSSudarsana Reddy Kalluru int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, 30203dc76caSSudarsana Reddy Kalluru struct qed_ptt *p_ptt); 30303dc76caSSudarsana Reddy Kalluru 30403dc76caSSudarsana Reddy Kalluru /** 30503dc76caSSudarsana Reddy Kalluru * @brief Bist clock test 30603dc76caSSudarsana Reddy Kalluru * 30703dc76caSSudarsana Reddy Kalluru * @param p_hwfn - hw function 30803dc76caSSudarsana Reddy Kalluru * @param p_ptt - PTT required for register access 30903dc76caSSudarsana Reddy Kalluru * 31003dc76caSSudarsana Reddy Kalluru * @return int - 0 - operation was successful. 31103dc76caSSudarsana Reddy Kalluru */ 31203dc76caSSudarsana Reddy Kalluru int qed_mcp_bist_clock_test(struct qed_hwfn *p_hwfn, 31303dc76caSSudarsana Reddy Kalluru struct qed_ptt *p_ptt); 31403dc76caSSudarsana Reddy Kalluru 315fe56b9e6SYuval Mintz /* Using hwfn number (and not pf_num) is required since in CMT mode, 316fe56b9e6SYuval Mintz * same pf_num may be used by two different hwfn 317fe56b9e6SYuval Mintz * TODO - this shouldn't really be in .h file, but until all fields 318fe56b9e6SYuval Mintz * required during hw-init will be placed in their correct place in shmem 319fe56b9e6SYuval Mintz * we need it in qed_dev.c [for readin the nvram reflection in shmem]. 320fe56b9e6SYuval Mintz */ 321fe56b9e6SYuval Mintz #define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (QED_IS_BB((p_hwfn)->cdev) ? \ 322fe56b9e6SYuval Mintz ((rel_pfid) | \ 323fe56b9e6SYuval Mintz ((p_hwfn)->abs_pf_id & 1) << 3) : \ 324fe56b9e6SYuval Mintz rel_pfid) 325fe56b9e6SYuval Mintz #define MCP_PF_ID(p_hwfn) MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id) 326fe56b9e6SYuval Mintz 327fe56b9e6SYuval Mintz /* TODO - this is only correct as long as only BB is supported, and 328fe56b9e6SYuval Mintz * no port-swapping is implemented; Afterwards we'll need to fix it. 329fe56b9e6SYuval Mintz */ 330fe56b9e6SYuval Mintz #define MFW_PORT(_p_hwfn) ((_p_hwfn)->abs_pf_id % \ 331fe56b9e6SYuval Mintz ((_p_hwfn)->cdev->num_ports_in_engines * 2)) 332fe56b9e6SYuval Mintz struct qed_mcp_info { 3335529bad9STomer Tayar spinlock_t lock; 3345529bad9STomer Tayar bool block_mb_sending; 335fe56b9e6SYuval Mintz u32 public_base; 336fe56b9e6SYuval Mintz u32 drv_mb_addr; 337fe56b9e6SYuval Mintz u32 mfw_mb_addr; 338fe56b9e6SYuval Mintz u32 port_addr; 339fe56b9e6SYuval Mintz u16 drv_mb_seq; 340fe56b9e6SYuval Mintz u16 drv_pulse_seq; 341cc875c2eSYuval Mintz struct qed_mcp_link_params link_input; 342cc875c2eSYuval Mintz struct qed_mcp_link_state link_output; 343cc875c2eSYuval Mintz struct qed_mcp_link_capabilities link_capabilities; 344fe56b9e6SYuval Mintz struct qed_mcp_function_info func_info; 345fe56b9e6SYuval Mintz u8 *mfw_mb_cur; 346fe56b9e6SYuval Mintz u8 *mfw_mb_shadow; 347fe56b9e6SYuval Mintz u16 mfw_mb_length; 348fe56b9e6SYuval Mintz u16 mcp_hist; 349fe56b9e6SYuval Mintz }; 350fe56b9e6SYuval Mintz 3515529bad9STomer Tayar struct qed_mcp_mb_params { 3525529bad9STomer Tayar u32 cmd; 3535529bad9STomer Tayar u32 param; 3545529bad9STomer Tayar union drv_union_data *p_data_src; 3555529bad9STomer Tayar union drv_union_data *p_data_dst; 3565529bad9STomer Tayar u32 mcp_resp; 3575529bad9STomer Tayar u32 mcp_param; 3585529bad9STomer Tayar }; 3595529bad9STomer Tayar 360fe56b9e6SYuval Mintz /** 361fe56b9e6SYuval Mintz * @brief Initialize the interface with the MCP 362fe56b9e6SYuval Mintz * 363fe56b9e6SYuval Mintz * @param p_hwfn - HW func 364fe56b9e6SYuval Mintz * @param p_ptt - PTT required for register access 365fe56b9e6SYuval Mintz * 366fe56b9e6SYuval Mintz * @return int 367fe56b9e6SYuval Mintz */ 368fe56b9e6SYuval Mintz int qed_mcp_cmd_init(struct qed_hwfn *p_hwfn, 369fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 370fe56b9e6SYuval Mintz 371fe56b9e6SYuval Mintz /** 372fe56b9e6SYuval Mintz * @brief Initialize the port interface with the MCP 373fe56b9e6SYuval Mintz * 374fe56b9e6SYuval Mintz * @param p_hwfn 375fe56b9e6SYuval Mintz * @param p_ptt 376fe56b9e6SYuval Mintz * Can only be called after `num_ports_in_engines' is set 377fe56b9e6SYuval Mintz */ 378fe56b9e6SYuval Mintz void qed_mcp_cmd_port_init(struct qed_hwfn *p_hwfn, 379fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 380fe56b9e6SYuval Mintz /** 381fe56b9e6SYuval Mintz * @brief Releases resources allocated during the init process. 382fe56b9e6SYuval Mintz * 383fe56b9e6SYuval Mintz * @param p_hwfn - HW func 384fe56b9e6SYuval Mintz * @param p_ptt - PTT required for register access 385fe56b9e6SYuval Mintz * 386fe56b9e6SYuval Mintz * @return int 387fe56b9e6SYuval Mintz */ 388fe56b9e6SYuval Mintz 389fe56b9e6SYuval Mintz int qed_mcp_free(struct qed_hwfn *p_hwfn); 390fe56b9e6SYuval Mintz 391fe56b9e6SYuval Mintz /** 392cc875c2eSYuval Mintz * @brief This function is called from the DPC context. After 393cc875c2eSYuval Mintz * pointing PTT to the mfw mb, check for events sent by the MCP 394cc875c2eSYuval Mintz * to the driver and ack them. In case a critical event 395cc875c2eSYuval Mintz * detected, it will be handled here, otherwise the work will be 396cc875c2eSYuval Mintz * queued to a sleepable work-queue. 397cc875c2eSYuval Mintz * 398cc875c2eSYuval Mintz * @param p_hwfn - HW function 399cc875c2eSYuval Mintz * @param p_ptt - PTT required for register access 400cc875c2eSYuval Mintz * @return int - 0 - operation 401cc875c2eSYuval Mintz * was successul. 402cc875c2eSYuval Mintz */ 403cc875c2eSYuval Mintz int qed_mcp_handle_events(struct qed_hwfn *p_hwfn, 404cc875c2eSYuval Mintz struct qed_ptt *p_ptt); 405cc875c2eSYuval Mintz 406cc875c2eSYuval Mintz /** 407fe56b9e6SYuval Mintz * @brief Sends a LOAD_REQ to the MFW, and in case operation 408fe56b9e6SYuval Mintz * succeed, returns whether this PF is the first on the 409fe56b9e6SYuval Mintz * chip/engine/port or function. This function should be 410fe56b9e6SYuval Mintz * called when driver is ready to accept MFW events after 411fe56b9e6SYuval Mintz * Storms initializations are done. 412fe56b9e6SYuval Mintz * 413fe56b9e6SYuval Mintz * @param p_hwfn - hw function 414fe56b9e6SYuval Mintz * @param p_ptt - PTT required for register access 415fe56b9e6SYuval Mintz * @param p_load_code - The MCP response param containing one 416fe56b9e6SYuval Mintz * of the following: 417fe56b9e6SYuval Mintz * FW_MSG_CODE_DRV_LOAD_ENGINE 418fe56b9e6SYuval Mintz * FW_MSG_CODE_DRV_LOAD_PORT 419fe56b9e6SYuval Mintz * FW_MSG_CODE_DRV_LOAD_FUNCTION 420fe56b9e6SYuval Mintz * @return int - 421fe56b9e6SYuval Mintz * 0 - Operation was successul. 422fe56b9e6SYuval Mintz * -EBUSY - Operation failed 423fe56b9e6SYuval Mintz */ 424fe56b9e6SYuval Mintz int qed_mcp_load_req(struct qed_hwfn *p_hwfn, 425fe56b9e6SYuval Mintz struct qed_ptt *p_ptt, 426fe56b9e6SYuval Mintz u32 *p_load_code); 427fe56b9e6SYuval Mintz 428fe56b9e6SYuval Mintz /** 429fe56b9e6SYuval Mintz * @brief Read the MFW mailbox into Current buffer. 430fe56b9e6SYuval Mintz * 431fe56b9e6SYuval Mintz * @param p_hwfn 432fe56b9e6SYuval Mintz * @param p_ptt 433fe56b9e6SYuval Mintz */ 434fe56b9e6SYuval Mintz void qed_mcp_read_mb(struct qed_hwfn *p_hwfn, 435fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 436fe56b9e6SYuval Mintz 437fe56b9e6SYuval Mintz /** 4380b55e27dSYuval Mintz * @brief Ack to mfw that driver finished FLR process for VFs 4390b55e27dSYuval Mintz * 4400b55e27dSYuval Mintz * @param p_hwfn 4410b55e27dSYuval Mintz * @param p_ptt 4420b55e27dSYuval Mintz * @param vfs_to_ack - bit mask of all engine VFs for which the PF acks. 4430b55e27dSYuval Mintz * 4440b55e27dSYuval Mintz * @param return int - 0 upon success. 4450b55e27dSYuval Mintz */ 4460b55e27dSYuval Mintz int qed_mcp_ack_vf_flr(struct qed_hwfn *p_hwfn, 4470b55e27dSYuval Mintz struct qed_ptt *p_ptt, u32 *vfs_to_ack); 4480b55e27dSYuval Mintz 4490b55e27dSYuval Mintz /** 450fe56b9e6SYuval Mintz * @brief - calls during init to read shmem of all function-related info. 451fe56b9e6SYuval Mintz * 452fe56b9e6SYuval Mintz * @param p_hwfn 453fe56b9e6SYuval Mintz * 454fe56b9e6SYuval Mintz * @param return 0 upon success. 455fe56b9e6SYuval Mintz */ 456fe56b9e6SYuval Mintz int qed_mcp_fill_shmem_func_info(struct qed_hwfn *p_hwfn, 457fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 458fe56b9e6SYuval Mintz 459fe56b9e6SYuval Mintz /** 460fe56b9e6SYuval Mintz * @brief - Reset the MCP using mailbox command. 461fe56b9e6SYuval Mintz * 462fe56b9e6SYuval Mintz * @param p_hwfn 463fe56b9e6SYuval Mintz * @param p_ptt 464fe56b9e6SYuval Mintz * 465fe56b9e6SYuval Mintz * @param return 0 upon success. 466fe56b9e6SYuval Mintz */ 467fe56b9e6SYuval Mintz int qed_mcp_reset(struct qed_hwfn *p_hwfn, 468fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 469fe56b9e6SYuval Mintz 470fe56b9e6SYuval Mintz /** 471fe56b9e6SYuval Mintz * @brief indicates whether the MFW objects [under mcp_info] are accessible 472fe56b9e6SYuval Mintz * 473fe56b9e6SYuval Mintz * @param p_hwfn 474fe56b9e6SYuval Mintz * 475fe56b9e6SYuval Mintz * @return true iff MFW is running and mcp_info is initialized 476fe56b9e6SYuval Mintz */ 477fe56b9e6SYuval Mintz bool qed_mcp_is_init(struct qed_hwfn *p_hwfn); 4781408cc1fSYuval Mintz 4791408cc1fSYuval Mintz /** 4801408cc1fSYuval Mintz * @brief request MFW to configure MSI-X for a VF 4811408cc1fSYuval Mintz * 4821408cc1fSYuval Mintz * @param p_hwfn 4831408cc1fSYuval Mintz * @param p_ptt 4841408cc1fSYuval Mintz * @param vf_id - absolute inside engine 4851408cc1fSYuval Mintz * @param num_sbs - number of entries to request 4861408cc1fSYuval Mintz * 4871408cc1fSYuval Mintz * @return int 4881408cc1fSYuval Mintz */ 4891408cc1fSYuval Mintz int qed_mcp_config_vf_msix(struct qed_hwfn *p_hwfn, 4901408cc1fSYuval Mintz struct qed_ptt *p_ptt, u8 vf_id, u8 num); 4911408cc1fSYuval Mintz 492a64b02d5SManish Chopra int qed_configure_pf_min_bandwidth(struct qed_dev *cdev, u8 min_bw); 4934b01e519SManish Chopra int qed_configure_pf_max_bandwidth(struct qed_dev *cdev, u8 max_bw); 4944b01e519SManish Chopra int __qed_configure_pf_max_bandwidth(struct qed_hwfn *p_hwfn, 4954b01e519SManish Chopra struct qed_ptt *p_ptt, 4964b01e519SManish Chopra struct qed_mcp_link_state *p_link, 4974b01e519SManish Chopra u8 max_bw); 498a64b02d5SManish Chopra int __qed_configure_pf_min_bandwidth(struct qed_hwfn *p_hwfn, 499a64b02d5SManish Chopra struct qed_ptt *p_ptt, 500a64b02d5SManish Chopra struct qed_mcp_link_state *p_link, 501a64b02d5SManish Chopra u8 min_bw); 502351a4dedSYuval Mintz 503351a4dedSYuval Mintz int qed_hw_init_first_eth(struct qed_hwfn *p_hwfn, 504351a4dedSYuval Mintz struct qed_ptt *p_ptt, u8 *p_pf); 505fe56b9e6SYuval Mintz #endif 506