125c089d7SYuval Mintz /* QLogic qed NIC Driver 225c089d7SYuval Mintz * Copyright (c) 2015 QLogic Corporation 325c089d7SYuval Mintz * 425c089d7SYuval Mintz * This software is available under the terms of the GNU General Public License 525c089d7SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 625c089d7SYuval Mintz * this source tree. 725c089d7SYuval Mintz */ 825c089d7SYuval Mintz 925c089d7SYuval Mintz #include <linux/types.h> 1025c089d7SYuval Mintz #include <asm/byteorder.h> 1125c089d7SYuval Mintz #include <asm/param.h> 1225c089d7SYuval Mintz #include <linux/delay.h> 1325c089d7SYuval Mintz #include <linux/dma-mapping.h> 1425c089d7SYuval Mintz #include <linux/etherdevice.h> 1525c089d7SYuval Mintz #include <linux/interrupt.h> 1625c089d7SYuval Mintz #include <linux/kernel.h> 1725c089d7SYuval Mintz #include <linux/module.h> 1825c089d7SYuval Mintz #include <linux/pci.h> 1925c089d7SYuval Mintz #include <linux/slab.h> 2025c089d7SYuval Mintz #include <linux/stddef.h> 2125c089d7SYuval Mintz #include <linux/string.h> 2225c089d7SYuval Mintz #include <linux/version.h> 2325c089d7SYuval Mintz #include <linux/workqueue.h> 2425c089d7SYuval Mintz #include <linux/bitops.h> 2525c089d7SYuval Mintz #include <linux/bug.h> 2625c089d7SYuval Mintz #include "qed.h" 2725c089d7SYuval Mintz #include <linux/qed/qed_chain.h> 2825c089d7SYuval Mintz #include "qed_cxt.h" 2925c089d7SYuval Mintz #include "qed_dev_api.h" 3025c089d7SYuval Mintz #include <linux/qed/qed_eth_if.h> 3125c089d7SYuval Mintz #include "qed_hsi.h" 3225c089d7SYuval Mintz #include "qed_hw.h" 3325c089d7SYuval Mintz #include "qed_int.h" 3425c089d7SYuval Mintz #include "qed_reg_addr.h" 3525c089d7SYuval Mintz #include "qed_sp.h" 3625c089d7SYuval Mintz 3725c089d7SYuval Mintz static int qed_fill_eth_dev_info(struct qed_dev *cdev, 3825c089d7SYuval Mintz struct qed_dev_eth_info *info) 3925c089d7SYuval Mintz { 4025c089d7SYuval Mintz int i; 4125c089d7SYuval Mintz 4225c089d7SYuval Mintz memset(info, 0, sizeof(*info)); 4325c089d7SYuval Mintz 4425c089d7SYuval Mintz info->num_tc = 1; 4525c089d7SYuval Mintz 4625c089d7SYuval Mintz if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { 4725c089d7SYuval Mintz for_each_hwfn(cdev, i) 4825c089d7SYuval Mintz info->num_queues += FEAT_NUM(&cdev->hwfns[i], 4925c089d7SYuval Mintz QED_PF_L2_QUE); 5025c089d7SYuval Mintz if (cdev->int_params.fp_msix_cnt) 5125c089d7SYuval Mintz info->num_queues = min_t(u8, info->num_queues, 5225c089d7SYuval Mintz cdev->int_params.fp_msix_cnt); 5325c089d7SYuval Mintz } else { 5425c089d7SYuval Mintz info->num_queues = cdev->num_hwfns; 5525c089d7SYuval Mintz } 5625c089d7SYuval Mintz 5725c089d7SYuval Mintz info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN); 5825c089d7SYuval Mintz ether_addr_copy(info->port_mac, 5925c089d7SYuval Mintz cdev->hwfns[0].hw_info.hw_mac_addr); 6025c089d7SYuval Mintz 6125c089d7SYuval Mintz qed_fill_dev_info(cdev, &info->common); 6225c089d7SYuval Mintz 6325c089d7SYuval Mintz return 0; 6425c089d7SYuval Mintz } 6525c089d7SYuval Mintz 6625c089d7SYuval Mintz static const struct qed_eth_ops qed_eth_ops_pass = { 6725c089d7SYuval Mintz .common = &qed_common_ops_pass, 6825c089d7SYuval Mintz .fill_dev_info = &qed_fill_eth_dev_info, 6925c089d7SYuval Mintz }; 7025c089d7SYuval Mintz 7125c089d7SYuval Mintz const struct qed_eth_ops *qed_get_eth_ops(u32 version) 7225c089d7SYuval Mintz { 7325c089d7SYuval Mintz if (version != QED_ETH_INTERFACE_VERSION) { 7425c089d7SYuval Mintz pr_notice("Cannot supply ethtool operations [%08x != %08x]\n", 7525c089d7SYuval Mintz version, QED_ETH_INTERFACE_VERSION); 7625c089d7SYuval Mintz return NULL; 7725c089d7SYuval Mintz } 7825c089d7SYuval Mintz 7925c089d7SYuval Mintz return &qed_eth_ops_pass; 8025c089d7SYuval Mintz } 8125c089d7SYuval Mintz EXPORT_SYMBOL(qed_get_eth_ops); 8225c089d7SYuval Mintz 8325c089d7SYuval Mintz void qed_put_eth_ops(void) 8425c089d7SYuval Mintz { 8525c089d7SYuval Mintz /* TODO - reference count for module? */ 8625c089d7SYuval Mintz } 8725c089d7SYuval Mintz EXPORT_SYMBOL(qed_put_eth_ops); 88