aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-06-11 18:44:42 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-11 18:44:42 -0400
commit1054cc150cf760f7b58ec8d2983ee7c85fb1df0a (patch)
tree4579104c7be1232f5de34544ac0913029e949673
parentefd0f11d85e16d375dddeb77e8e78f43c67c5b13 (diff)
parent038782d6d0d92c3cc98ffc08cd78cfe46a2eca41 (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.h6
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c9
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c24
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c32
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
444struct qlcnic_fw_dump { 446struct 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
2088static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) 2088static 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
665static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter, 663static 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