mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
Merge branch 'qlcnic-enhancements'
Shahed Shaikh says: ==================== qlcnic: enhancements This series adds few enhancements. o Patch from Harish reorders the sequence of header files inclusion, keeping kernel's header files on top. o Firmware introduced a new feature which allows driver to increases the size of firmware dump of iSCSI function which is being collected by NIC driver. o Print buffer address which is holding a firmware dump. o Use vzalloc() instead kzalloc() for allocating large chunk of memory which will avoid potential memory allocation failure. o Add new device ID for 0x8C30 which is a 83xx series based VF function. Please apply this series to net-next. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e72ee3ed51
@ -24,9 +24,7 @@
|
||||
#include <linux/mii.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <linux/bitops.h>
|
||||
@ -39,8 +37,8 @@
|
||||
|
||||
#define _QLCNIC_LINUX_MAJOR 5
|
||||
#define _QLCNIC_LINUX_MINOR 3
|
||||
#define _QLCNIC_LINUX_SUBVERSION 62
|
||||
#define QLCNIC_LINUX_VERSIONID "5.3.62"
|
||||
#define _QLCNIC_LINUX_SUBVERSION 63
|
||||
#define QLCNIC_LINUX_VERSIONID "5.3.63"
|
||||
#define QLCNIC_DRV_IDC_VER 0x01
|
||||
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
|
||||
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
|
||||
@ -926,6 +924,7 @@ struct qlcnic_mac_vlan_list {
|
||||
#define QLCNIC_FW_CAPABILITY_SET_DRV_VER BIT_5
|
||||
#define QLCNIC_FW_CAPABILITY_2_BEACON BIT_7
|
||||
#define QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG BIT_9
|
||||
#define QLCNIC_FW_CAPABILITY_2_EXT_ISCSI_DUMP BIT_13
|
||||
|
||||
#define QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD BIT_0
|
||||
#define QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD BIT_1
|
||||
@ -2291,8 +2290,9 @@ extern const struct ethtool_ops qlcnic_ethtool_failed_ops;
|
||||
|
||||
#define PCI_DEVICE_ID_QLOGIC_QLE824X 0x8020
|
||||
#define PCI_DEVICE_ID_QLOGIC_QLE834X 0x8030
|
||||
#define PCI_DEVICE_ID_QLOGIC_QLE8830 0x8830
|
||||
#define PCI_DEVICE_ID_QLOGIC_VF_QLE834X 0x8430
|
||||
#define PCI_DEVICE_ID_QLOGIC_QLE8830 0x8830
|
||||
#define PCI_DEVICE_ID_QLOGIC_VF_QLE8C30 0x8C30
|
||||
#define PCI_DEVICE_ID_QLOGIC_QLE844X 0x8040
|
||||
#define PCI_DEVICE_ID_QLOGIC_VF_QLE844X 0x8440
|
||||
|
||||
@ -2319,7 +2319,8 @@ static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter)
|
||||
(device == PCI_DEVICE_ID_QLOGIC_QLE8830) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X)) ? true : false;
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -2335,7 +2336,8 @@ static inline bool qlcnic_sriov_vf_check(struct qlcnic_adapter *adapter)
|
||||
bool status;
|
||||
|
||||
status = ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X)) ? true : false;
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -2351,7 +2353,8 @@ static inline bool qlcnic_83xx_vf_check(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
unsigned short device = adapter->pdev->device;
|
||||
|
||||
return (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ? true : false;
|
||||
return ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
|
||||
(device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
|
||||
}
|
||||
|
||||
static inline bool qlcnic_sriov_check(struct qlcnic_adapter *adapter)
|
||||
|
@ -5,14 +5,15 @@
|
||||
* See LICENSE.qlcnic for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_sriov.h"
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/aer.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_sriov.h"
|
||||
|
||||
static void __qlcnic_83xx_process_aen(struct qlcnic_adapter *);
|
||||
static int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *, u8);
|
||||
static void qlcnic_83xx_configure_mac(struct qlcnic_adapter *, u8 *, u8,
|
||||
@ -118,6 +119,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
|
||||
{QLCNIC_CMD_DCB_QUERY_CAP, 1, 2},
|
||||
{QLCNIC_CMD_DCB_QUERY_PARAM, 1, 50},
|
||||
{QLCNIC_CMD_SET_INGRESS_ENCAP, 2, 1},
|
||||
{QLCNIC_CMD_83XX_EXTEND_ISCSI_DUMP_CAP, 4, 1},
|
||||
};
|
||||
|
||||
const u32 qlcnic_83xx_ext_reg_tbl[] = {
|
||||
@ -3513,6 +3515,31 @@ out:
|
||||
qlcnic_free_mbx_args(&cmd);
|
||||
}
|
||||
|
||||
#define QLCNIC_83XX_ADD_PORT0 BIT_0
|
||||
#define QLCNIC_83XX_ADD_PORT1 BIT_1
|
||||
#define QLCNIC_83XX_EXTENDED_MEM_SIZE 13 /* In MB */
|
||||
int qlcnic_83xx_extend_md_capab(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_cmd_args cmd;
|
||||
int err;
|
||||
|
||||
err = qlcnic_alloc_mbx_args(&cmd, adapter,
|
||||
QLCNIC_CMD_83XX_EXTEND_ISCSI_DUMP_CAP);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cmd.req.arg[1] = (QLCNIC_83XX_ADD_PORT0 | QLCNIC_83XX_ADD_PORT1);
|
||||
cmd.req.arg[2] = QLCNIC_83XX_EXTENDED_MEM_SIZE;
|
||||
cmd.req.arg[3] = QLCNIC_83XX_EXTENDED_MEM_SIZE;
|
||||
|
||||
err = qlcnic_issue_cmd(adapter, &cmd);
|
||||
if (err)
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"failed to issue extend iSCSI minidump capability\n");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int qlcnic_83xx_reg_test(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 major, minor, sub;
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
#define QLCNIC_83XX_BAR0_LENGTH 0x4000
|
||||
@ -626,6 +627,7 @@ int qlcnic_83xx_set_port_eswitch_status(struct qlcnic_adapter *, int, int *);
|
||||
|
||||
void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *);
|
||||
void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data);
|
||||
int qlcnic_83xx_extend_md_capab(struct qlcnic_adapter *);
|
||||
int qlcnic_83xx_get_settings(struct qlcnic_adapter *, struct ethtool_cmd *);
|
||||
int qlcnic_83xx_set_settings(struct qlcnic_adapter *, struct ethtool_cmd *);
|
||||
void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *,
|
||||
|
@ -1384,7 +1384,7 @@ static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
|
||||
size_t size;
|
||||
u64 addr;
|
||||
|
||||
temp = kzalloc(fw->size, GFP_KERNEL);
|
||||
temp = vzalloc(fw->size);
|
||||
if (!temp) {
|
||||
release_firmware(fw);
|
||||
fw_info->fw = NULL;
|
||||
@ -1430,7 +1430,7 @@ static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
|
||||
exit:
|
||||
release_firmware(fw);
|
||||
fw_info->fw = NULL;
|
||||
kfree(temp);
|
||||
vfree(temp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -5,13 +5,13 @@
|
||||
* See LICENSE.qlcnic for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_hdr.h"
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <net/ip.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_hdr.h"
|
||||
|
||||
#define MASK(n) ((1ULL<<(n))-1)
|
||||
#define OCM_WIN_P3P(addr) (addr & 0xffc0000)
|
||||
|
||||
|
@ -109,6 +109,7 @@ enum qlcnic_regs {
|
||||
#define QLCNIC_CMD_GET_LED_CONFIG 0x6A
|
||||
#define QLCNIC_CMD_83XX_SET_DRV_VER 0x6F
|
||||
#define QLCNIC_CMD_ADD_RCV_RINGS 0x0B
|
||||
#define QLCNIC_CMD_83XX_EXTEND_ISCSI_DUMP_CAP 0x37
|
||||
|
||||
#define QLCNIC_INTRPT_INTX 1
|
||||
#define QLCNIC_INTRPT_MSIX 3
|
||||
|
@ -7,11 +7,6 @@
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_sriov.h"
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
#include <linux/swab.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/if_vlan.h>
|
||||
@ -25,6 +20,10 @@
|
||||
#include <net/vxlan.h>
|
||||
#endif
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_sriov.h"
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
MODULE_DESCRIPTION("QLogic 1/10 GbE Converged/Intelligent Ethernet Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(QLCNIC_LINUX_VERSIONID);
|
||||
@ -111,8 +110,9 @@ static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter)
|
||||
static const struct pci_device_id qlcnic_pci_tbl[] = {
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_QLE824X),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_QLE834X),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_QLE8830),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE834X),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_QLE8830),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE8C30),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_QLE844X),
|
||||
ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE844X),
|
||||
{0,}
|
||||
@ -1149,6 +1149,7 @@ static void qlcnic_get_bar_length(u32 dev_id, ulong *bar)
|
||||
case PCI_DEVICE_ID_QLOGIC_QLE844X:
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE8C30:
|
||||
*bar = QLCNIC_83XX_BAR0_LENGTH;
|
||||
break;
|
||||
default:
|
||||
@ -2491,6 +2492,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
qlcnic_83xx_register_map(ahw);
|
||||
break;
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE8C30:
|
||||
case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
|
||||
qlcnic_sriov_vf_register_map(ahw);
|
||||
break;
|
||||
|
@ -5,13 +5,13 @@
|
||||
* See LICENSE.qlcnic for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#include <net/ip.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_hdr.h"
|
||||
#include "qlcnic_83xx_hw.h"
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
#include <net/ip.h>
|
||||
|
||||
#define QLC_83XX_MINIDUMP_FLASH 0x520000
|
||||
#define QLC_83XX_OCM_INDEX 3
|
||||
#define QLC_83XX_PCI_INDEX 0
|
||||
@ -1388,27 +1388,60 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
|
||||
fw_dump->clr = 1;
|
||||
snprintf(mesg, sizeof(mesg), "FW_DUMP=%s", adapter->netdev->name);
|
||||
netdev_info(adapter->netdev,
|
||||
"Dump data %d bytes captured, template header size %d bytes\n",
|
||||
fw_dump->size, fw_dump->tmpl_hdr_size);
|
||||
"Dump data %d bytes captured, dump data address = %p, template header size %d bytes, template address = %p\n",
|
||||
fw_dump->size, fw_dump->data, fw_dump->tmpl_hdr_size,
|
||||
fw_dump->tmpl_hdr);
|
||||
/* Send a udev event to notify availability of FW dump */
|
||||
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
qlcnic_83xx_md_check_extended_dump_capability(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
/* For special adapters (with 0x8830 device ID), where iSCSI firmware
|
||||
* dump needs to be captured as part of regular firmware dump
|
||||
* collection process, firmware exports it's capability through
|
||||
* capability registers
|
||||
*/
|
||||
return ((adapter->pdev->device == PCI_DEVICE_ID_QLOGIC_QLE8830) &&
|
||||
(adapter->ahw->extra_capability[0] &
|
||||
QLCNIC_FW_CAPABILITY_2_EXT_ISCSI_DUMP));
|
||||
}
|
||||
|
||||
void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
u32 prev_version, current_version;
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
bool extended = false;
|
||||
|
||||
prev_version = adapter->fw_version;
|
||||
current_version = qlcnic_83xx_get_fw_version(adapter);
|
||||
|
||||
if (fw_dump->tmpl_hdr == NULL || current_version > prev_version) {
|
||||
vfree(fw_dump->tmpl_hdr);
|
||||
|
||||
if (qlcnic_83xx_md_check_extended_dump_capability(adapter))
|
||||
extended = !qlcnic_83xx_extend_md_capab(adapter);
|
||||
|
||||
if (!qlcnic_fw_cmd_get_minidump_temp(adapter))
|
||||
dev_info(&pdev->dev, "Supports FW dump capability\n");
|
||||
|
||||
/* Once we have minidump template with extended iSCSI dump
|
||||
* capability, update the minidump capture mask to 0x1f as
|
||||
* per FW requirement
|
||||
*/
|
||||
if (extended) {
|
||||
struct qlcnic_83xx_dump_template_hdr *hdr;
|
||||
|
||||
hdr = fw_dump->tmpl_hdr;
|
||||
hdr->drv_cap_mask = 0x1f;
|
||||
fw_dump->cap_mask = 0x1f;
|
||||
dev_info(&pdev->dev,
|
||||
"Extended iSCSI dump capability and updated capture mask to 0x1f\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,10 +8,11 @@
|
||||
#ifndef _QLCNIC_83XX_SRIOV_H_
|
||||
#define _QLCNIC_83XX_SRIOV_H_
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
|
||||
extern const u32 qlcnic_83xx_reg_tbl[];
|
||||
extern const u32 qlcnic_83xx_ext_reg_tbl[];
|
||||
|
||||
|
@ -5,10 +5,11 @@
|
||||
* See LICENSE.qlcnic for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "qlcnic_sriov.h"
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_83xx_hw.h"
|
||||
#include <linux/types.h>
|
||||
|
||||
#define QLC_BC_COMMAND 0
|
||||
#define QLC_BC_RESPONSE 1
|
||||
|
@ -5,9 +5,10 @@
|
||||
* See LICENSE.qlcnic for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "qlcnic_sriov.h"
|
||||
#include "qlcnic.h"
|
||||
#include <linux/types.h>
|
||||
|
||||
#define QLCNIC_SRIOV_VF_MAX_MAC 7
|
||||
#define QLC_VF_MIN_TX_RATE 100
|
||||
|
@ -7,10 +7,6 @@
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
#include <linux/swab.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <net/ip.h>
|
||||
@ -24,6 +20,9 @@
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#endif
|
||||
|
||||
#include "qlcnic.h"
|
||||
#include "qlcnic_hw.h"
|
||||
|
||||
int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
|
Loading…
Reference in New Issue
Block a user