aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShahed Shaikh <shahed.shaikh@qlogic.com>2014-06-11 14:09:11 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-11 18:44:29 -0400
commit4da005cf1e30897520106114a8ce11a5aa558497 (patch)
treeeb6a1cdb2afbfa0139ffec9460a7681091fb3d29
parentefd0f11d85e16d375dddeb77e8e78f43c67c5b13 (diff)
qlcnic: Pre-allocate DMA buffer used for minidump collection
Pre-allocate the physically contiguous DMA buffer used for minidump collection at driver load time, rather than at run time, to minimize allocation failures. Driver will allocate the buffer at load time if PEX DMA support capability is indicated by the adapter. Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c14
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c32
3 files changed, 28 insertions, 20 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 41abe6070466..d85f7e1e117f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -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_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index f06ba90b4282..1c188919cdda 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);
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