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