mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-23 19:14:30 +08:00
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
1054cc150c
@ -39,8 +39,8 @@
|
||||
|
||||
#define _QLCNIC_LINUX_MAJOR 5
|
||||
#define _QLCNIC_LINUX_MINOR 3
|
||||
#define _QLCNIC_LINUX_SUBVERSION 59
|
||||
#define QLCNIC_LINUX_VERSIONID "5.3.59"
|
||||
#define _QLCNIC_LINUX_SUBVERSION 60
|
||||
#define QLCNIC_LINUX_VERSIONID "5.3.60"
|
||||
#define QLCNIC_DRV_IDC_VER 0x01
|
||||
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
|
||||
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
|
||||
@ -441,6 +441,8 @@ struct qlcnic_82xx_dump_template_hdr {
|
||||
u32 rsvd1[0];
|
||||
};
|
||||
|
||||
#define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16)
|
||||
|
||||
struct qlcnic_fw_dump {
|
||||
u8 clr; /* flag to indicate if dump is cleared */
|
||||
bool enable; /* enable/disable dump */
|
||||
|
@ -726,6 +726,11 @@ static int qlcnic_set_channels(struct net_device *dev,
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
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)
|
||||
return -EINVAL;
|
||||
|
||||
@ -734,7 +739,7 @@ static int qlcnic_set_channels(struct net_device *dev,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (channel->rx_count) {
|
||||
if (adapter->drv_sds_rings != channel->rx_count) {
|
||||
err = qlcnic_validate_rings(adapter, channel->rx_count,
|
||||
QLCNIC_RX_QUEUE);
|
||||
if (err) {
|
||||
@ -745,7 +750,7 @@ static int qlcnic_set_channels(struct net_device *dev,
|
||||
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,
|
||||
QLCNIC_TX_QUEUE);
|
||||
if (err) {
|
||||
|
@ -2087,12 +2087,20 @@ err_out:
|
||||
|
||||
static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
|
||||
|
||||
kfree(adapter->recv_ctx);
|
||||
adapter->recv_ctx = NULL;
|
||||
|
||||
if (adapter->ahw->fw_dump.tmpl_hdr) {
|
||||
vfree(adapter->ahw->fw_dump.tmpl_hdr);
|
||||
adapter->ahw->fw_dump.tmpl_hdr = NULL;
|
||||
if (fw_dump->tmpl_hdr) {
|
||||
vfree(fw_dump->tmpl_hdr);
|
||||
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);
|
||||
@ -3995,16 +4003,6 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt,
|
||||
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)) {
|
||||
netdev_err(netdev, "%s rings value should be a power of 2\n",
|
||||
buf);
|
||||
|
@ -660,8 +660,6 @@ out:
|
||||
#define QLC_DMA_CMD_BUFF_ADDR_HI 4
|
||||
#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,
|
||||
struct __mem *mem)
|
||||
{
|
||||
@ -1155,6 +1153,7 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter)
|
||||
u32 version, csum, *tmp_buf;
|
||||
u8 use_flash_temp = 0;
|
||||
u32 temp_size = 0;
|
||||
void *temp_buffer;
|
||||
int err;
|
||||
|
||||
ahw = adapter->ahw;
|
||||
@ -1204,6 +1203,19 @@ flash_temp:
|
||||
|
||||
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,
|
||||
"Default minidump capture mask 0x%x\n",
|
||||
fw_dump->cap_mask);
|
||||
@ -1223,7 +1235,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
|
||||
struct device *dev = &adapter->pdev->dev;
|
||||
struct qlcnic_hardware_context *ahw;
|
||||
struct qlcnic_dump_entry *entry;
|
||||
void *temp_buffer, *tmpl_hdr;
|
||||
void *tmpl_hdr;
|
||||
u32 ocm_window;
|
||||
__le32 *buffer;
|
||||
char mesg[64];
|
||||
@ -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, 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)) {
|
||||
ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops);
|
||||
fw_dump_ops = qlcnic_fw_dump_ops;
|
||||
@ -1334,10 +1336,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
|
||||
/* Send a udev event to notify availability of FW dump */
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user