Commit 1054cc15 authored by David S. Miller's avatar David S. Miller

Merge branch 'qlcnic-next'

Shahed Shaikh says:

====================
This series contains an enhancement in the area of firmware minidump collection
and optimization of ring count validation function.

Please apply this series to net-next.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents efd0f11d 038782d6
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
#define _QLCNIC_LINUX_MAJOR 5 #define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MINOR 3 #define _QLCNIC_LINUX_MINOR 3
#define _QLCNIC_LINUX_SUBVERSION 59 #define _QLCNIC_LINUX_SUBVERSION 60
#define QLCNIC_LINUX_VERSIONID "5.3.59" #define QLCNIC_LINUX_VERSIONID "5.3.60"
#define QLCNIC_DRV_IDC_VER 0x01 #define QLCNIC_DRV_IDC_VER 0x01
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
...@@ -441,6 +441,8 @@ struct qlcnic_82xx_dump_template_hdr { ...@@ -441,6 +441,8 @@ struct qlcnic_82xx_dump_template_hdr {
u32 rsvd1[0]; u32 rsvd1[0];
}; };
#define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16)
struct qlcnic_fw_dump { struct qlcnic_fw_dump {
u8 clr; /* flag to indicate if dump is cleared */ u8 clr; /* flag to indicate if dump is cleared */
bool enable; /* enable/disable dump */ bool enable; /* enable/disable dump */
......
...@@ -726,6 +726,11 @@ static int qlcnic_set_channels(struct net_device *dev, ...@@ -726,6 +726,11 @@ static int qlcnic_set_channels(struct net_device *dev,
struct qlcnic_adapter *adapter = netdev_priv(dev); struct qlcnic_adapter *adapter = netdev_priv(dev);
int err; int err;
if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
netdev_err(dev, "No RSS/TSS support in non MSI-X mode\n");
return -EINVAL;
}
if (channel->other_count || channel->combined_count) if (channel->other_count || channel->combined_count)
return -EINVAL; return -EINVAL;
...@@ -734,7 +739,7 @@ static int qlcnic_set_channels(struct net_device *dev, ...@@ -734,7 +739,7 @@ static int qlcnic_set_channels(struct net_device *dev,
if (err) if (err)
return err; return err;
if (channel->rx_count) { if (adapter->drv_sds_rings != channel->rx_count) {
err = qlcnic_validate_rings(adapter, channel->rx_count, err = qlcnic_validate_rings(adapter, channel->rx_count,
QLCNIC_RX_QUEUE); QLCNIC_RX_QUEUE);
if (err) { if (err) {
...@@ -745,7 +750,7 @@ static int qlcnic_set_channels(struct net_device *dev, ...@@ -745,7 +750,7 @@ static int qlcnic_set_channels(struct net_device *dev,
adapter->drv_rss_rings = channel->rx_count; adapter->drv_rss_rings = channel->rx_count;
} }
if (channel->tx_count) { if (adapter->drv_tx_rings != channel->tx_count) {
err = qlcnic_validate_rings(adapter, channel->tx_count, err = qlcnic_validate_rings(adapter, channel->tx_count,
QLCNIC_TX_QUEUE); QLCNIC_TX_QUEUE);
if (err) { if (err) {
......
...@@ -2087,12 +2087,20 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) ...@@ -2087,12 +2087,20 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter)
{ {
struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
kfree(adapter->recv_ctx); kfree(adapter->recv_ctx);
adapter->recv_ctx = NULL; adapter->recv_ctx = NULL;
if (adapter->ahw->fw_dump.tmpl_hdr) { if (fw_dump->tmpl_hdr) {
vfree(adapter->ahw->fw_dump.tmpl_hdr); vfree(fw_dump->tmpl_hdr);
adapter->ahw->fw_dump.tmpl_hdr = NULL; fw_dump->tmpl_hdr = NULL;
}
if (fw_dump->dma_buffer) {
dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE,
fw_dump->dma_buffer, fw_dump->phys_addr);
fw_dump->dma_buffer = NULL;
} }
kfree(adapter->ahw->reset.buff); kfree(adapter->ahw->reset.buff);
...@@ -3995,16 +4003,6 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, ...@@ -3995,16 +4003,6 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt,
strcpy(buf, "Tx"); strcpy(buf, "Tx");
} }
if (!QLCNIC_IS_MSI_FAMILY(adapter)) {
netdev_err(netdev, "No RSS/TSS support in INT-x mode\n");
return -EINVAL;
}
if (adapter->flags & QLCNIC_MSI_ENABLED) {
netdev_err(netdev, "No RSS/TSS support in MSI mode\n");
return -EINVAL;
}
if (!is_power_of_2(ring_cnt)) { if (!is_power_of_2(ring_cnt)) {
netdev_err(netdev, "%s rings value should be a power of 2\n", netdev_err(netdev, "%s rings value should be a power of 2\n",
buf); buf);
......
...@@ -660,8 +660,6 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, ...@@ -660,8 +660,6 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter,
#define QLC_DMA_CMD_BUFF_ADDR_HI 4 #define QLC_DMA_CMD_BUFF_ADDR_HI 4
#define QLC_DMA_CMD_STATUS_CTRL 8 #define QLC_DMA_CMD_STATUS_CTRL 8
#define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16)
static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter, static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter,
struct __mem *mem) struct __mem *mem)
{ {
...@@ -1155,6 +1153,7 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter) ...@@ -1155,6 +1153,7 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter)
u32 version, csum, *tmp_buf; u32 version, csum, *tmp_buf;
u8 use_flash_temp = 0; u8 use_flash_temp = 0;
u32 temp_size = 0; u32 temp_size = 0;
void *temp_buffer;
int err; int err;
ahw = adapter->ahw; ahw = adapter->ahw;
...@@ -1204,6 +1203,19 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter) ...@@ -1204,6 +1203,19 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter)
qlcnic_cache_tmpl_hdr_values(adapter, fw_dump); qlcnic_cache_tmpl_hdr_values(adapter, fw_dump);
if (fw_dump->use_pex_dma) {
fw_dump->dma_buffer = NULL;
temp_buffer = dma_alloc_coherent(&adapter->pdev->dev,
QLC_PEX_DMA_READ_SIZE,
&fw_dump->phys_addr,
GFP_KERNEL);
if (!temp_buffer)
fw_dump->use_pex_dma = false;
else
fw_dump->dma_buffer = temp_buffer;
}
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"Default minidump capture mask 0x%x\n", "Default minidump capture mask 0x%x\n",
fw_dump->cap_mask); fw_dump->cap_mask);
...@@ -1223,7 +1235,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) ...@@ -1223,7 +1235,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
struct device *dev = &adapter->pdev->dev; struct device *dev = &adapter->pdev->dev;
struct qlcnic_hardware_context *ahw; struct qlcnic_hardware_context *ahw;
struct qlcnic_dump_entry *entry; struct qlcnic_dump_entry *entry;
void *temp_buffer, *tmpl_hdr; void *tmpl_hdr;
u32 ocm_window; u32 ocm_window;
__le32 *buffer; __le32 *buffer;
char mesg[64]; char mesg[64];
...@@ -1267,16 +1279,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) ...@@ -1267,16 +1279,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
qlcnic_set_sys_info(adapter, tmpl_hdr, 0, QLCNIC_DRIVER_VERSION); qlcnic_set_sys_info(adapter, tmpl_hdr, 0, QLCNIC_DRIVER_VERSION);
qlcnic_set_sys_info(adapter, tmpl_hdr, 1, adapter->fw_version); qlcnic_set_sys_info(adapter, tmpl_hdr, 1, adapter->fw_version);
if (fw_dump->use_pex_dma) {
temp_buffer = dma_alloc_coherent(dev, QLC_PEX_DMA_READ_SIZE,
&fw_dump->phys_addr,
GFP_KERNEL);
if (!temp_buffer)
fw_dump->use_pex_dma = false;
else
fw_dump->dma_buffer = temp_buffer;
}
if (qlcnic_82xx_check(adapter)) { if (qlcnic_82xx_check(adapter)) {
ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops); ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops);
fw_dump_ops = qlcnic_fw_dump_ops; fw_dump_ops = qlcnic_fw_dump_ops;
...@@ -1334,10 +1336,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) ...@@ -1334,10 +1336,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
/* Send a udev event to notify availability of FW dump */ /* Send a udev event to notify availability of FW dump */
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg); kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg);
if (fw_dump->use_pex_dma)
dma_free_coherent(dev, QLC_PEX_DMA_READ_SIZE,
fw_dump->dma_buffer, fw_dump->phys_addr);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment