diff options
author | David S. Miller <davem@davemloft.net> | 2014-06-11 18:44:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-11 18:44:42 -0400 |
commit | 1054cc150cf760f7b58ec8d2983ee7c85fb1df0a (patch) | |
tree | 4579104c7be1232f5de34544ac0913029e949673 | |
parent | efd0f11d85e16d375dddeb77e8e78f43c67c5b13 (diff) | |
parent | 038782d6d0d92c3cc98ffc08cd78cfe46a2eca41 (diff) |
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>
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 24 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 32 |
4 files changed, 37 insertions, 34 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 41abe6070466..be618b9e874f 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -39,8 +39,8 @@ | |||
39 | 39 | ||
40 | #define _QLCNIC_LINUX_MAJOR 5 | 40 | #define _QLCNIC_LINUX_MAJOR 5 |
41 | #define _QLCNIC_LINUX_MINOR 3 | 41 | #define _QLCNIC_LINUX_MINOR 3 |
42 | #define _QLCNIC_LINUX_SUBVERSION 59 | 42 | #define _QLCNIC_LINUX_SUBVERSION 60 |
43 | #define QLCNIC_LINUX_VERSIONID "5.3.59" | 43 | #define QLCNIC_LINUX_VERSIONID "5.3.60" |
44 | #define QLCNIC_DRV_IDC_VER 0x01 | 44 | #define QLCNIC_DRV_IDC_VER 0x01 |
45 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ | 45 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ |
46 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) | 46 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) |
@@ -441,6 +441,8 @@ struct qlcnic_82xx_dump_template_hdr { | |||
441 | u32 rsvd1[0]; | 441 | u32 rsvd1[0]; |
442 | }; | 442 | }; |
443 | 443 | ||
444 | #define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16) | ||
445 | |||
444 | struct qlcnic_fw_dump { | 446 | struct qlcnic_fw_dump { |
445 | u8 clr; /* flag to indicate if dump is cleared */ | 447 | u8 clr; /* flag to indicate if dump is cleared */ |
446 | bool enable; /* enable/disable dump */ | 448 | bool enable; /* enable/disable dump */ |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index 5bacf5210aed..1b7f3dbae289 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
@@ -726,6 +726,11 @@ static int qlcnic_set_channels(struct net_device *dev, | |||
726 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 726 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
727 | int err; | 727 | int err; |
728 | 728 | ||
729 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | ||
730 | netdev_err(dev, "No RSS/TSS support in non MSI-X mode\n"); | ||
731 | return -EINVAL; | ||
732 | } | ||
733 | |||
729 | if (channel->other_count || channel->combined_count) | 734 | if (channel->other_count || channel->combined_count) |
730 | return -EINVAL; | 735 | return -EINVAL; |
731 | 736 | ||
@@ -734,7 +739,7 @@ static int qlcnic_set_channels(struct net_device *dev, | |||
734 | if (err) | 739 | if (err) |
735 | return err; | 740 | return err; |
736 | 741 | ||
737 | if (channel->rx_count) { | 742 | if (adapter->drv_sds_rings != channel->rx_count) { |
738 | err = qlcnic_validate_rings(adapter, channel->rx_count, | 743 | err = qlcnic_validate_rings(adapter, channel->rx_count, |
739 | QLCNIC_RX_QUEUE); | 744 | QLCNIC_RX_QUEUE); |
740 | if (err) { | 745 | if (err) { |
@@ -745,7 +750,7 @@ static int qlcnic_set_channels(struct net_device *dev, | |||
745 | adapter->drv_rss_rings = channel->rx_count; | 750 | adapter->drv_rss_rings = channel->rx_count; |
746 | } | 751 | } |
747 | 752 | ||
748 | if (channel->tx_count) { | 753 | if (adapter->drv_tx_rings != channel->tx_count) { |
749 | err = qlcnic_validate_rings(adapter, channel->tx_count, | 754 | err = qlcnic_validate_rings(adapter, channel->tx_count, |
750 | QLCNIC_TX_QUEUE); | 755 | QLCNIC_TX_QUEUE); |
751 | if (err) { | 756 | if (err) { |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index f06ba90b4282..4fc186713b66 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -2087,12 +2087,20 @@ err_out: | |||
2087 | 2087 | ||
2088 | static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) | 2088 | static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) |
2089 | { | 2089 | { |
2090 | struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; | ||
2091 | |||
2090 | kfree(adapter->recv_ctx); | 2092 | kfree(adapter->recv_ctx); |
2091 | adapter->recv_ctx = NULL; | 2093 | adapter->recv_ctx = NULL; |
2092 | 2094 | ||
2093 | if (adapter->ahw->fw_dump.tmpl_hdr) { | 2095 | if (fw_dump->tmpl_hdr) { |
2094 | vfree(adapter->ahw->fw_dump.tmpl_hdr); | 2096 | vfree(fw_dump->tmpl_hdr); |
2095 | adapter->ahw->fw_dump.tmpl_hdr = NULL; | 2097 | fw_dump->tmpl_hdr = NULL; |
2098 | } | ||
2099 | |||
2100 | if (fw_dump->dma_buffer) { | ||
2101 | dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE, | ||
2102 | fw_dump->dma_buffer, fw_dump->phys_addr); | ||
2103 | fw_dump->dma_buffer = NULL; | ||
2096 | } | 2104 | } |
2097 | 2105 | ||
2098 | kfree(adapter->ahw->reset.buff); | 2106 | kfree(adapter->ahw->reset.buff); |
@@ -3995,16 +4003,6 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, | |||
3995 | strcpy(buf, "Tx"); | 4003 | strcpy(buf, "Tx"); |
3996 | } | 4004 | } |
3997 | 4005 | ||
3998 | if (!QLCNIC_IS_MSI_FAMILY(adapter)) { | ||
3999 | netdev_err(netdev, "No RSS/TSS support in INT-x mode\n"); | ||
4000 | return -EINVAL; | ||
4001 | } | ||
4002 | |||
4003 | if (adapter->flags & QLCNIC_MSI_ENABLED) { | ||
4004 | netdev_err(netdev, "No RSS/TSS support in MSI mode\n"); | ||
4005 | return -EINVAL; | ||
4006 | } | ||
4007 | |||
4008 | if (!is_power_of_2(ring_cnt)) { | 4006 | if (!is_power_of_2(ring_cnt)) { |
4009 | netdev_err(netdev, "%s rings value should be a power of 2\n", | 4007 | netdev_err(netdev, "%s rings value should be a power of 2\n", |
4010 | buf); | 4008 | buf); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c index f7694da8ed5d..e46fc39d425d 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | |||
@@ -660,8 +660,6 @@ out: | |||
660 | #define QLC_DMA_CMD_BUFF_ADDR_HI 4 | 660 | #define QLC_DMA_CMD_BUFF_ADDR_HI 4 |
661 | #define QLC_DMA_CMD_STATUS_CTRL 8 | 661 | #define QLC_DMA_CMD_STATUS_CTRL 8 |
662 | 662 | ||
663 | #define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16) | ||
664 | |||
665 | static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter, | 663 | static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter, |
666 | struct __mem *mem) | 664 | struct __mem *mem) |
667 | { | 665 | { |
@@ -1155,6 +1153,7 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter) | |||
1155 | u32 version, csum, *tmp_buf; | 1153 | u32 version, csum, *tmp_buf; |
1156 | u8 use_flash_temp = 0; | 1154 | u8 use_flash_temp = 0; |
1157 | u32 temp_size = 0; | 1155 | u32 temp_size = 0; |
1156 | void *temp_buffer; | ||
1158 | int err; | 1157 | int err; |
1159 | 1158 | ||
1160 | ahw = adapter->ahw; | 1159 | ahw = adapter->ahw; |
@@ -1204,6 +1203,19 @@ flash_temp: | |||
1204 | 1203 | ||
1205 | qlcnic_cache_tmpl_hdr_values(adapter, fw_dump); | 1204 | qlcnic_cache_tmpl_hdr_values(adapter, fw_dump); |
1206 | 1205 | ||
1206 | if (fw_dump->use_pex_dma) { | ||
1207 | fw_dump->dma_buffer = NULL; | ||
1208 | temp_buffer = dma_alloc_coherent(&adapter->pdev->dev, | ||
1209 | QLC_PEX_DMA_READ_SIZE, | ||
1210 | &fw_dump->phys_addr, | ||
1211 | GFP_KERNEL); | ||
1212 | if (!temp_buffer) | ||
1213 | fw_dump->use_pex_dma = false; | ||
1214 | else | ||
1215 | fw_dump->dma_buffer = temp_buffer; | ||
1216 | } | ||
1217 | |||
1218 | |||
1207 | dev_info(&adapter->pdev->dev, | 1219 | dev_info(&adapter->pdev->dev, |
1208 | "Default minidump capture mask 0x%x\n", | 1220 | "Default minidump capture mask 0x%x\n", |
1209 | fw_dump->cap_mask); | 1221 | fw_dump->cap_mask); |
@@ -1223,7 +1235,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) | |||
1223 | struct device *dev = &adapter->pdev->dev; | 1235 | struct device *dev = &adapter->pdev->dev; |
1224 | struct qlcnic_hardware_context *ahw; | 1236 | struct qlcnic_hardware_context *ahw; |
1225 | struct qlcnic_dump_entry *entry; | 1237 | struct qlcnic_dump_entry *entry; |
1226 | void *temp_buffer, *tmpl_hdr; | 1238 | void *tmpl_hdr; |
1227 | u32 ocm_window; | 1239 | u32 ocm_window; |
1228 | __le32 *buffer; | 1240 | __le32 *buffer; |
1229 | char mesg[64]; | 1241 | char mesg[64]; |
@@ -1267,16 +1279,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) | |||
1267 | qlcnic_set_sys_info(adapter, tmpl_hdr, 0, QLCNIC_DRIVER_VERSION); | 1279 | qlcnic_set_sys_info(adapter, tmpl_hdr, 0, QLCNIC_DRIVER_VERSION); |
1268 | qlcnic_set_sys_info(adapter, tmpl_hdr, 1, adapter->fw_version); | 1280 | qlcnic_set_sys_info(adapter, tmpl_hdr, 1, adapter->fw_version); |
1269 | 1281 | ||
1270 | if (fw_dump->use_pex_dma) { | ||
1271 | temp_buffer = dma_alloc_coherent(dev, QLC_PEX_DMA_READ_SIZE, | ||
1272 | &fw_dump->phys_addr, | ||
1273 | GFP_KERNEL); | ||
1274 | if (!temp_buffer) | ||
1275 | fw_dump->use_pex_dma = false; | ||
1276 | else | ||
1277 | fw_dump->dma_buffer = temp_buffer; | ||
1278 | } | ||
1279 | |||
1280 | if (qlcnic_82xx_check(adapter)) { | 1282 | if (qlcnic_82xx_check(adapter)) { |
1281 | ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops); | 1283 | ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops); |
1282 | fw_dump_ops = qlcnic_fw_dump_ops; | 1284 | fw_dump_ops = qlcnic_fw_dump_ops; |
@@ -1334,10 +1336,6 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) | |||
1334 | /* Send a udev event to notify availability of FW dump */ | 1336 | /* Send a udev event to notify availability of FW dump */ |
1335 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg); | 1337 | kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg); |
1336 | 1338 | ||
1337 | if (fw_dump->use_pex_dma) | ||
1338 | dma_free_coherent(dev, QLC_PEX_DMA_READ_SIZE, | ||
1339 | fw_dump->dma_buffer, fw_dump->phys_addr); | ||
1340 | |||
1341 | return 0; | 1339 | return 0; |
1342 | } | 1340 | } |
1343 | 1341 | ||