162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is part of the Chelsio T4 PCI-E SR-IOV Virtual Function Ethernet 362306a36Sopenharmony_ci * driver for Linux. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2009-2010 Chelsio Communications, Inc. All rights reserved. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This software is available to you under a choice of one of two 862306a36Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 962306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 1062306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the 1162306a36Sopenharmony_ci * OpenIB.org BSD license below: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or 1462306a36Sopenharmony_ci * without modification, are permitted provided that the following 1562306a36Sopenharmony_ci * conditions are met: 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * - Redistributions of source code must retain the above 1862306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 1962306a36Sopenharmony_ci * disclaimer. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * - Redistributions in binary form must reproduce the above 2262306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 2362306a36Sopenharmony_ci * disclaimer in the documentation and/or other materials 2462306a36Sopenharmony_ci * provided with the distribution. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2762306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2862306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2962306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 3062306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 3162306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 3262306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3362306a36Sopenharmony_ci * SOFTWARE. 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#ifndef __T4VF_COMMON_H__ 3762306a36Sopenharmony_ci#define __T4VF_COMMON_H__ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#include "../cxgb4/t4_hw.h" 4062306a36Sopenharmony_ci#include "../cxgb4/t4fw_api.h" 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision)) 4362306a36Sopenharmony_ci#define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf) 4462306a36Sopenharmony_ci#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* All T4 and later chips have their PCI-E Device IDs encoded as 0xVFPP where: 4762306a36Sopenharmony_ci * 4862306a36Sopenharmony_ci * V = "4" for T4; "5" for T5, etc. or 4962306a36Sopenharmony_ci * = "a" for T4 FPGA; "b" for T4 FPGA, etc. 5062306a36Sopenharmony_ci * F = "0" for PF 0..3; "4".."7" for PF4..7; and "8" for VFs 5162306a36Sopenharmony_ci * PP = adapter product designation 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ci#define CHELSIO_T4 0x4 5462306a36Sopenharmony_ci#define CHELSIO_T5 0x5 5562306a36Sopenharmony_ci#define CHELSIO_T6 0x6 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cienum chip_type { 5862306a36Sopenharmony_ci T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1), 5962306a36Sopenharmony_ci T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2), 6062306a36Sopenharmony_ci T4_FIRST_REV = T4_A1, 6162306a36Sopenharmony_ci T4_LAST_REV = T4_A2, 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0), 6462306a36Sopenharmony_ci T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1), 6562306a36Sopenharmony_ci T5_FIRST_REV = T5_A0, 6662306a36Sopenharmony_ci T5_LAST_REV = T5_A1, 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 7062306a36Sopenharmony_ci * The "len16" field of a Firmware Command Structure ... 7162306a36Sopenharmony_ci */ 7262306a36Sopenharmony_ci#define FW_LEN16(fw_struct) FW_CMD_LEN16_V(sizeof(fw_struct) / 16) 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* 7562306a36Sopenharmony_ci * Per-VF statistics. 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_cistruct t4vf_port_stats { 7862306a36Sopenharmony_ci /* 7962306a36Sopenharmony_ci * TX statistics. 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_ci u64 tx_bcast_bytes; /* broadcast */ 8262306a36Sopenharmony_ci u64 tx_bcast_frames; 8362306a36Sopenharmony_ci u64 tx_mcast_bytes; /* multicast */ 8462306a36Sopenharmony_ci u64 tx_mcast_frames; 8562306a36Sopenharmony_ci u64 tx_ucast_bytes; /* unicast */ 8662306a36Sopenharmony_ci u64 tx_ucast_frames; 8762306a36Sopenharmony_ci u64 tx_drop_frames; /* TX dropped frames */ 8862306a36Sopenharmony_ci u64 tx_offload_bytes; /* offload */ 8962306a36Sopenharmony_ci u64 tx_offload_frames; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* 9262306a36Sopenharmony_ci * RX statistics. 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_ci u64 rx_bcast_bytes; /* broadcast */ 9562306a36Sopenharmony_ci u64 rx_bcast_frames; 9662306a36Sopenharmony_ci u64 rx_mcast_bytes; /* multicast */ 9762306a36Sopenharmony_ci u64 rx_mcast_frames; 9862306a36Sopenharmony_ci u64 rx_ucast_bytes; 9962306a36Sopenharmony_ci u64 rx_ucast_frames; /* unicast */ 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci u64 rx_err_frames; /* RX error frames */ 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/* 10562306a36Sopenharmony_ci * Per-"port" (Virtual Interface) link configuration ... 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_citypedef u16 fw_port_cap16_t; /* 16-bit Port Capabilities integral value */ 10862306a36Sopenharmony_citypedef u32 fw_port_cap32_t; /* 32-bit Port Capabilities integral value */ 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cienum fw_caps { 11162306a36Sopenharmony_ci FW_CAPS_UNKNOWN = 0, /* 0'ed out initial state */ 11262306a36Sopenharmony_ci FW_CAPS16 = 1, /* old Firmware: 16-bit Port Capabilities */ 11362306a36Sopenharmony_ci FW_CAPS32 = 2, /* new Firmware: 32-bit Port Capabilities */ 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cienum cc_pause { 11762306a36Sopenharmony_ci PAUSE_RX = 1 << 0, 11862306a36Sopenharmony_ci PAUSE_TX = 1 << 1, 11962306a36Sopenharmony_ci PAUSE_AUTONEG = 1 << 2 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cienum cc_fec { 12362306a36Sopenharmony_ci FEC_AUTO = 1 << 0, /* IEEE 802.3 "automatic" */ 12462306a36Sopenharmony_ci FEC_RS = 1 << 1, /* Reed-Solomon */ 12562306a36Sopenharmony_ci FEC_BASER_RS = 1 << 2, /* BaseR/Reed-Solomon */ 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistruct link_config { 12962306a36Sopenharmony_ci fw_port_cap32_t pcaps; /* link capabilities */ 13062306a36Sopenharmony_ci fw_port_cap32_t acaps; /* advertised capabilities */ 13162306a36Sopenharmony_ci fw_port_cap32_t lpacaps; /* peer advertised capabilities */ 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci fw_port_cap32_t speed_caps; /* speed(s) user has requested */ 13462306a36Sopenharmony_ci u32 speed; /* actual link speed */ 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci enum cc_pause requested_fc; /* flow control user has requested */ 13762306a36Sopenharmony_ci enum cc_pause fc; /* actual link flow control */ 13862306a36Sopenharmony_ci enum cc_pause advertised_fc; /* actual advertised flow control */ 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci enum cc_fec auto_fec; /* Forward Error Correction: */ 14162306a36Sopenharmony_ci enum cc_fec requested_fec; /* "automatic" (IEEE 802.3), */ 14262306a36Sopenharmony_ci enum cc_fec fec; /* requested, and actual in use */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci unsigned char autoneg; /* autonegotiating? */ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci unsigned char link_ok; /* link up? */ 14762306a36Sopenharmony_ci unsigned char link_down_rc; /* link down reason */ 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci/* Return true if the Link Configuration supports "High Speeds" (those greater 15162306a36Sopenharmony_ci * than 1Gb/s). 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_cistatic inline bool is_x_10g_port(const struct link_config *lc) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci fw_port_cap32_t speeds, high_speeds; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci speeds = FW_PORT_CAP32_SPEED_V(FW_PORT_CAP32_SPEED_G(lc->pcaps)); 15862306a36Sopenharmony_ci high_speeds = 15962306a36Sopenharmony_ci speeds & ~(FW_PORT_CAP32_SPEED_100M | FW_PORT_CAP32_SPEED_1G); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci return high_speeds != 0; 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/* 16562306a36Sopenharmony_ci * General device parameters ... 16662306a36Sopenharmony_ci */ 16762306a36Sopenharmony_cistruct dev_params { 16862306a36Sopenharmony_ci u32 fwrev; /* firmware version */ 16962306a36Sopenharmony_ci u32 tprev; /* TP Microcode Version */ 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* 17362306a36Sopenharmony_ci * Scatter Gather Engine parameters. These are almost all determined by the 17462306a36Sopenharmony_ci * Physical Function Driver. We just need to grab them to see within which 17562306a36Sopenharmony_ci * environment we're playing ... 17662306a36Sopenharmony_ci */ 17762306a36Sopenharmony_cistruct sge_params { 17862306a36Sopenharmony_ci u32 sge_control; /* padding, boundaries, lengths, etc. */ 17962306a36Sopenharmony_ci u32 sge_control2; /* T5: more of the same */ 18062306a36Sopenharmony_ci u32 sge_host_page_size; /* PF0-7 page sizes */ 18162306a36Sopenharmony_ci u32 sge_egress_queues_per_page; /* PF0-7 egress queues/page */ 18262306a36Sopenharmony_ci u32 sge_ingress_queues_per_page;/* PF0-7 ingress queues/page */ 18362306a36Sopenharmony_ci u32 sge_vf_hps; /* host page size for our vf */ 18462306a36Sopenharmony_ci u32 sge_vf_eq_qpp; /* egress queues/page for our VF */ 18562306a36Sopenharmony_ci u32 sge_vf_iq_qpp; /* ingress queues/page for our VF */ 18662306a36Sopenharmony_ci u32 sge_fl_buffer_size[16]; /* free list buffer sizes */ 18762306a36Sopenharmony_ci u32 sge_ingress_rx_threshold; /* RX counter interrupt threshold[4] */ 18862306a36Sopenharmony_ci u32 sge_congestion_control; /* congestion thresholds, etc. */ 18962306a36Sopenharmony_ci u32 sge_timer_value_0_and_1; /* interrupt coalescing timer values */ 19062306a36Sopenharmony_ci u32 sge_timer_value_2_and_3; 19162306a36Sopenharmony_ci u32 sge_timer_value_4_and_5; 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci/* 19562306a36Sopenharmony_ci * Vital Product Data parameters. 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_cistruct vpd_params { 19862306a36Sopenharmony_ci u32 cclk; /* Core Clock (KHz) */ 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/* Stores chip specific parameters */ 20262306a36Sopenharmony_cistruct arch_specific_params { 20362306a36Sopenharmony_ci u32 sge_fl_db; 20462306a36Sopenharmony_ci u16 mps_tcam_size; 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* 20862306a36Sopenharmony_ci * Global Receive Side Scaling (RSS) parameters in host-native format. 20962306a36Sopenharmony_ci */ 21062306a36Sopenharmony_cistruct rss_params { 21162306a36Sopenharmony_ci unsigned int mode; /* RSS mode */ 21262306a36Sopenharmony_ci union { 21362306a36Sopenharmony_ci struct { 21462306a36Sopenharmony_ci unsigned int synmapen:1; /* SYN Map Enable */ 21562306a36Sopenharmony_ci unsigned int syn4tupenipv6:1; /* enable hashing 4-tuple IPv6 SYNs */ 21662306a36Sopenharmony_ci unsigned int syn2tupenipv6:1; /* enable hashing 2-tuple IPv6 SYNs */ 21762306a36Sopenharmony_ci unsigned int syn4tupenipv4:1; /* enable hashing 4-tuple IPv4 SYNs */ 21862306a36Sopenharmony_ci unsigned int syn2tupenipv4:1; /* enable hashing 2-tuple IPv4 SYNs */ 21962306a36Sopenharmony_ci unsigned int ofdmapen:1; /* Offload Map Enable */ 22062306a36Sopenharmony_ci unsigned int tnlmapen:1; /* Tunnel Map Enable */ 22162306a36Sopenharmony_ci unsigned int tnlalllookup:1; /* Tunnel All Lookup */ 22262306a36Sopenharmony_ci unsigned int hashtoeplitz:1; /* use Toeplitz hash */ 22362306a36Sopenharmony_ci } basicvirtual; 22462306a36Sopenharmony_ci } u; 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/* 22862306a36Sopenharmony_ci * Virtual Interface RSS Configuration in host-native format. 22962306a36Sopenharmony_ci */ 23062306a36Sopenharmony_ciunion rss_vi_config { 23162306a36Sopenharmony_ci struct { 23262306a36Sopenharmony_ci u16 defaultq; /* Ingress Queue ID for !tnlalllookup */ 23362306a36Sopenharmony_ci unsigned int ip6fourtupen:1; /* hash 4-tuple IPv6 ingress packets */ 23462306a36Sopenharmony_ci unsigned int ip6twotupen:1; /* hash 2-tuple IPv6 ingress packets */ 23562306a36Sopenharmony_ci unsigned int ip4fourtupen:1; /* hash 4-tuple IPv4 ingress packets */ 23662306a36Sopenharmony_ci unsigned int ip4twotupen:1; /* hash 2-tuple IPv4 ingress packets */ 23762306a36Sopenharmony_ci int udpen; /* hash 4-tuple UDP ingress packets */ 23862306a36Sopenharmony_ci } basicvirtual; 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci/* 24262306a36Sopenharmony_ci * Maximum resources provisioned for a PCI VF. 24362306a36Sopenharmony_ci */ 24462306a36Sopenharmony_cistruct vf_resources { 24562306a36Sopenharmony_ci unsigned int nvi; /* N virtual interfaces */ 24662306a36Sopenharmony_ci unsigned int neq; /* N egress Qs */ 24762306a36Sopenharmony_ci unsigned int nethctrl; /* N egress ETH or CTRL Qs */ 24862306a36Sopenharmony_ci unsigned int niqflint; /* N ingress Qs/w free list(s) & intr */ 24962306a36Sopenharmony_ci unsigned int niq; /* N ingress Qs */ 25062306a36Sopenharmony_ci unsigned int tc; /* PCI-E traffic class */ 25162306a36Sopenharmony_ci unsigned int pmask; /* port access rights mask */ 25262306a36Sopenharmony_ci unsigned int nexactf; /* N exact MPS filters */ 25362306a36Sopenharmony_ci unsigned int r_caps; /* read capabilities */ 25462306a36Sopenharmony_ci unsigned int wx_caps; /* write/execute capabilities */ 25562306a36Sopenharmony_ci}; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* 25862306a36Sopenharmony_ci * Per-"adapter" (Virtual Function) parameters. 25962306a36Sopenharmony_ci */ 26062306a36Sopenharmony_cistruct adapter_params { 26162306a36Sopenharmony_ci struct dev_params dev; /* general device parameters */ 26262306a36Sopenharmony_ci struct sge_params sge; /* Scatter Gather Engine */ 26362306a36Sopenharmony_ci struct vpd_params vpd; /* Vital Product Data */ 26462306a36Sopenharmony_ci struct rss_params rss; /* Receive Side Scaling */ 26562306a36Sopenharmony_ci struct vf_resources vfres; /* Virtual Function Resource limits */ 26662306a36Sopenharmony_ci struct arch_specific_params arch; /* chip specific params */ 26762306a36Sopenharmony_ci enum chip_type chip; /* chip code */ 26862306a36Sopenharmony_ci u8 nports; /* # of Ethernet "ports" */ 26962306a36Sopenharmony_ci u8 fw_caps_support; /* 32-bit Port Capabilities */ 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/* Firmware Mailbox Command/Reply log. All values are in Host-Endian format. 27362306a36Sopenharmony_ci * The access and execute times are signed in order to accommodate negative 27462306a36Sopenharmony_ci * error returns. 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_cistruct mbox_cmd { 27762306a36Sopenharmony_ci u64 cmd[MBOX_LEN / 8]; /* a Firmware Mailbox Command/Reply */ 27862306a36Sopenharmony_ci u64 timestamp; /* OS-dependent timestamp */ 27962306a36Sopenharmony_ci u32 seqno; /* sequence number */ 28062306a36Sopenharmony_ci s16 access; /* time (ms) to access mailbox */ 28162306a36Sopenharmony_ci s16 execute; /* time (ms) to execute */ 28262306a36Sopenharmony_ci}; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistruct mbox_cmd_log { 28562306a36Sopenharmony_ci unsigned int size; /* number of entries in the log */ 28662306a36Sopenharmony_ci unsigned int cursor; /* next position in the log to write */ 28762306a36Sopenharmony_ci u32 seqno; /* next sequence number */ 28862306a36Sopenharmony_ci /* variable length mailbox command log starts here */ 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* Given a pointer to a Firmware Mailbox Command Log and a log entry index, 29262306a36Sopenharmony_ci * return a pointer to the specified entry. 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_cistatic inline struct mbox_cmd *mbox_cmd_log_entry(struct mbox_cmd_log *log, 29562306a36Sopenharmony_ci unsigned int entry_idx) 29662306a36Sopenharmony_ci{ 29762306a36Sopenharmony_ci return &((struct mbox_cmd *)&(log)[1])[entry_idx]; 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci#include "adapter.h" 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci#ifndef PCI_VENDOR_ID_CHELSIO 30362306a36Sopenharmony_ci# define PCI_VENDOR_ID_CHELSIO 0x1425 30462306a36Sopenharmony_ci#endif 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci#define for_each_port(adapter, iter) \ 30762306a36Sopenharmony_ci for (iter = 0; iter < (adapter)->params.nports; iter++) 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic inline unsigned int core_ticks_per_usec(const struct adapter *adapter) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return adapter->params.vpd.cclk / 1000; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic inline unsigned int us_to_core_ticks(const struct adapter *adapter, 31562306a36Sopenharmony_ci unsigned int us) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci return (us * adapter->params.vpd.cclk) / 1000; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic inline unsigned int core_ticks_to_us(const struct adapter *adapter, 32162306a36Sopenharmony_ci unsigned int ticks) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci return (ticks * 1000) / adapter->params.vpd.cclk; 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciint t4vf_wr_mbox_core(struct adapter *, const void *, int, void *, bool); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic inline int t4vf_wr_mbox(struct adapter *adapter, const void *cmd, 32962306a36Sopenharmony_ci int size, void *rpl) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci return t4vf_wr_mbox_core(adapter, cmd, size, rpl, true); 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_cistatic inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd, 33562306a36Sopenharmony_ci int size, void *rpl) 33662306a36Sopenharmony_ci{ 33762306a36Sopenharmony_ci return t4vf_wr_mbox_core(adapter, cmd, size, rpl, false); 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci#define CHELSIO_PCI_ID_VER(dev_id) ((dev_id) >> 12) 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic inline int is_t4(enum chip_type chip) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4; 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci/** 34862306a36Sopenharmony_ci * hash_mac_addr - return the hash value of a MAC address 34962306a36Sopenharmony_ci * @addr: the 48-bit Ethernet MAC address 35062306a36Sopenharmony_ci * 35162306a36Sopenharmony_ci * Hashes a MAC address according to the hash function used by hardware 35262306a36Sopenharmony_ci * inexact (hash) address matching. 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_cistatic inline int hash_mac_addr(const u8 *addr) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci u32 a = ((u32)addr[0] << 16) | ((u32)addr[1] << 8) | addr[2]; 35762306a36Sopenharmony_ci u32 b = ((u32)addr[3] << 16) | ((u32)addr[4] << 8) | addr[5]; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci a ^= b; 36062306a36Sopenharmony_ci a ^= (a >> 12); 36162306a36Sopenharmony_ci a ^= (a >> 6); 36262306a36Sopenharmony_ci return a & 0x3f; 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ciint t4vf_wait_dev_ready(struct adapter *); 36662306a36Sopenharmony_ciint t4vf_port_init(struct adapter *, int); 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ciint t4vf_fw_reset(struct adapter *); 36962306a36Sopenharmony_ciint t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ciint t4vf_fl_pkt_align(struct adapter *adapter); 37262306a36Sopenharmony_cienum t4_bar2_qtype { T4_BAR2_QTYPE_EGRESS, T4_BAR2_QTYPE_INGRESS }; 37362306a36Sopenharmony_ciint t4vf_bar2_sge_qregs(struct adapter *adapter, 37462306a36Sopenharmony_ci unsigned int qid, 37562306a36Sopenharmony_ci enum t4_bar2_qtype qtype, 37662306a36Sopenharmony_ci u64 *pbar2_qoffset, 37762306a36Sopenharmony_ci unsigned int *pbar2_qid); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ciunsigned int t4vf_get_pf_from_vf(struct adapter *); 38062306a36Sopenharmony_ciint t4vf_get_sge_params(struct adapter *); 38162306a36Sopenharmony_ciint t4vf_get_vpd_params(struct adapter *); 38262306a36Sopenharmony_ciint t4vf_get_dev_params(struct adapter *); 38362306a36Sopenharmony_ciint t4vf_get_rss_glb_config(struct adapter *); 38462306a36Sopenharmony_ciint t4vf_get_vfres(struct adapter *); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ciint t4vf_read_rss_vi_config(struct adapter *, unsigned int, 38762306a36Sopenharmony_ci union rss_vi_config *); 38862306a36Sopenharmony_ciint t4vf_write_rss_vi_config(struct adapter *, unsigned int, 38962306a36Sopenharmony_ci union rss_vi_config *); 39062306a36Sopenharmony_ciint t4vf_config_rss_range(struct adapter *, unsigned int, int, int, 39162306a36Sopenharmony_ci const u16 *, int); 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ciint t4vf_alloc_vi(struct adapter *, int); 39462306a36Sopenharmony_ciint t4vf_free_vi(struct adapter *, int); 39562306a36Sopenharmony_ciint t4vf_enable_vi(struct adapter *adapter, unsigned int viid, bool rx_en, 39662306a36Sopenharmony_ci bool tx_en); 39762306a36Sopenharmony_ciint t4vf_enable_pi(struct adapter *adapter, struct port_info *pi, bool rx_en, 39862306a36Sopenharmony_ci bool tx_en); 39962306a36Sopenharmony_ciint t4vf_identify_port(struct adapter *, unsigned int, unsigned int); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ciint t4vf_set_rxmode(struct adapter *, unsigned int, int, int, int, int, int, 40262306a36Sopenharmony_ci bool); 40362306a36Sopenharmony_ciint t4vf_alloc_mac_filt(struct adapter *, unsigned int, bool, unsigned int, 40462306a36Sopenharmony_ci const u8 **, u16 *, u64 *, bool); 40562306a36Sopenharmony_ciint t4vf_free_mac_filt(struct adapter *, unsigned int, unsigned int naddr, 40662306a36Sopenharmony_ci const u8 **, bool); 40762306a36Sopenharmony_ciint t4vf_change_mac(struct adapter *, unsigned int, int, const u8 *, bool); 40862306a36Sopenharmony_ciint t4vf_set_addr_hash(struct adapter *, unsigned int, bool, u64, bool); 40962306a36Sopenharmony_ciint t4vf_get_port_stats(struct adapter *, int, struct t4vf_port_stats *); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ciint t4vf_iq_free(struct adapter *, unsigned int, unsigned int, unsigned int, 41262306a36Sopenharmony_ci unsigned int); 41362306a36Sopenharmony_ciint t4vf_eth_eq_free(struct adapter *, unsigned int); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ciint t4vf_update_port_info(struct port_info *pi); 41662306a36Sopenharmony_ciint t4vf_handle_fw_rpl(struct adapter *, const __be64 *); 41762306a36Sopenharmony_ciint t4vf_prep_adapter(struct adapter *); 41862306a36Sopenharmony_ciint t4vf_get_vf_mac_acl(struct adapter *adapter, unsigned int port, 41962306a36Sopenharmony_ci unsigned int *naddr, u8 *addr); 42062306a36Sopenharmony_ciint t4vf_get_vf_vlan_acl(struct adapter *adapter); 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci#endif /* __T4VF_COMMON_H__ */ 423