aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/qlogic')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h21
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c374
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c12
3 files changed, 185 insertions, 222 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 04c70153833f..2fd1ba8fee4a 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -36,8 +36,8 @@
36 36
37#define _QLCNIC_LINUX_MAJOR 5 37#define _QLCNIC_LINUX_MAJOR 5
38#define _QLCNIC_LINUX_MINOR 0 38#define _QLCNIC_LINUX_MINOR 0
39#define _QLCNIC_LINUX_SUBVERSION 23 39#define _QLCNIC_LINUX_SUBVERSION 24
40#define QLCNIC_LINUX_VERSIONID "5.0.23" 40#define QLCNIC_LINUX_VERSIONID "5.0.24"
41#define QLCNIC_DRV_IDC_VER 0x01 41#define QLCNIC_DRV_IDC_VER 0x01
42#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ 42#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
43 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) 43 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -583,6 +583,7 @@ struct qlcnic_recv_context {
583#define QLCNIC_CDRP_CMD_DESTROY_RX_CTX 0x00000008 583#define QLCNIC_CDRP_CMD_DESTROY_RX_CTX 0x00000008
584#define QLCNIC_CDRP_CMD_CREATE_TX_CTX 0x00000009 584#define QLCNIC_CDRP_CMD_CREATE_TX_CTX 0x00000009
585#define QLCNIC_CDRP_CMD_DESTROY_TX_CTX 0x0000000a 585#define QLCNIC_CDRP_CMD_DESTROY_TX_CTX 0x0000000a
586#define QLCNIC_CDRP_CMD_INTRPT_TEST 0x00000011
586#define QLCNIC_CDRP_CMD_SET_MTU 0x00000012 587#define QLCNIC_CDRP_CMD_SET_MTU 0x00000012
587#define QLCNIC_CDRP_CMD_READ_PHY 0x00000013 588#define QLCNIC_CDRP_CMD_READ_PHY 0x00000013
588#define QLCNIC_CDRP_CMD_WRITE_PHY 0x00000014 589#define QLCNIC_CDRP_CMD_WRITE_PHY 0x00000014
@@ -1358,6 +1359,18 @@ struct qlcnic_dump_operations {
1358 struct qlcnic_dump_entry *, u32 *); 1359 struct qlcnic_dump_entry *, u32 *);
1359}; 1360};
1360 1361
1362struct _cdrp_cmd {
1363 u32 cmd;
1364 u32 arg1;
1365 u32 arg2;
1366 u32 arg3;
1367};
1368
1369struct qlcnic_cmd_args {
1370 struct _cdrp_cmd req;
1371 struct _cdrp_cmd rsp;
1372};
1373
1361int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter); 1374int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter);
1362int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config); 1375int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config);
1363 1376
@@ -1470,9 +1483,7 @@ int qlcnic_check_loopback_buff(unsigned char *data, u8 mac[]);
1470 1483
1471/* Functions from qlcnic_main.c */ 1484/* Functions from qlcnic_main.c */
1472int qlcnic_reset_context(struct qlcnic_adapter *); 1485int qlcnic_reset_context(struct qlcnic_adapter *);
1473u32 qlcnic_issue_cmd(struct qlcnic_adapter *adapter, 1486void qlcnic_issue_cmd(struct qlcnic_adapter *adapter, struct qlcnic_cmd_args *);
1474 u32 pci_fn, u32 version, u32 arg1, u32 arg2, u32 arg3, u32 cmd,
1475 u32 *rd_args[3]);
1476void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); 1487void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings);
1477int qlcnic_diag_alloc_res(struct net_device *netdev, int test); 1488int qlcnic_diag_alloc_res(struct net_device *netdev, int test);
1478netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev); 1489netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index e0c85a5e91d0..569a837d2ac4 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -26,50 +26,54 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
26 return rsp; 26 return rsp;
27} 27}
28 28
29u32 29void
30qlcnic_issue_cmd(struct qlcnic_adapter *adapter, 30qlcnic_issue_cmd(struct qlcnic_adapter *adapter, struct qlcnic_cmd_args *cmd)
31 u32 pci_fn, u32 version, u32 arg1, u32 arg2, u32 arg3, u32 cmd,
32 u32 *rd_args[3])
33{ 31{
34 u32 rsp; 32 u32 rsp;
35 u32 signature; 33 u32 signature;
36 u32 rcode = QLCNIC_RCODE_SUCCESS;
37 struct pci_dev *pdev = adapter->pdev; 34 struct pci_dev *pdev = adapter->pdev;
35 struct qlcnic_hardware_context *ahw = adapter->ahw;
38 36
39 signature = QLCNIC_CDRP_SIGNATURE_MAKE(pci_fn, version); 37 signature = QLCNIC_CDRP_SIGNATURE_MAKE(ahw->pci_func,
38 adapter->fw_hal_version);
40 39
41 /* Acquire semaphore before accessing CRB */ 40 /* Acquire semaphore before accessing CRB */
42 if (qlcnic_api_lock(adapter)) 41 if (qlcnic_api_lock(adapter)) {
43 return QLCNIC_RCODE_TIMEOUT; 42 cmd->rsp.cmd = QLCNIC_RCODE_TIMEOUT;
43 return;
44 }
44 45
45 QLCWR32(adapter, QLCNIC_SIGN_CRB_OFFSET, signature); 46 QLCWR32(adapter, QLCNIC_SIGN_CRB_OFFSET, signature);
46 QLCWR32(adapter, QLCNIC_ARG1_CRB_OFFSET, arg1); 47 QLCWR32(adapter, QLCNIC_ARG1_CRB_OFFSET, cmd->req.arg1);
47 QLCWR32(adapter, QLCNIC_ARG2_CRB_OFFSET, arg2); 48 QLCWR32(adapter, QLCNIC_ARG2_CRB_OFFSET, cmd->req.arg2);
48 QLCWR32(adapter, QLCNIC_ARG3_CRB_OFFSET, arg3); 49 QLCWR32(adapter, QLCNIC_ARG3_CRB_OFFSET, cmd->req.arg3);
49 QLCWR32(adapter, QLCNIC_CDRP_CRB_OFFSET, QLCNIC_CDRP_FORM_CMD(cmd)); 50 QLCWR32(adapter, QLCNIC_CDRP_CRB_OFFSET,
51 QLCNIC_CDRP_FORM_CMD(cmd->req.cmd));
50 52
51 rsp = qlcnic_poll_rsp(adapter); 53 rsp = qlcnic_poll_rsp(adapter);
52 54
53 if (rsp == QLCNIC_CDRP_RSP_TIMEOUT) { 55 if (rsp == QLCNIC_CDRP_RSP_TIMEOUT) {
54 dev_err(&pdev->dev, "card response timeout.\n"); 56 dev_err(&pdev->dev, "card response timeout.\n");
55 rcode = QLCNIC_RCODE_TIMEOUT; 57 cmd->rsp.cmd = QLCNIC_RCODE_TIMEOUT;
56 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { 58 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
57 rcode = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET); 59 cmd->rsp.cmd = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET);
58 dev_err(&pdev->dev, "failed card response code:0x%x\n", 60 dev_err(&pdev->dev, "failed card response code:0x%x\n",
59 rcode); 61 cmd->rsp.cmd);
60 } else if (rsp == QLCNIC_CDRP_RSP_OK) { 62 } else if (rsp == QLCNIC_CDRP_RSP_OK) {
61 if (rd_args[1]) 63 cmd->rsp.cmd = QLCNIC_RCODE_SUCCESS;
62 *rd_args[1] = QLCRD32(adapter, QLCNIC_ARG2_CRB_OFFSET); 64 if (cmd->rsp.arg2)
63 if (rd_args[2]) 65 cmd->rsp.arg2 = QLCRD32(adapter,
64 *rd_args[2] = QLCRD32(adapter, QLCNIC_ARG3_CRB_OFFSET); 66 QLCNIC_ARG2_CRB_OFFSET);
67 if (cmd->rsp.arg3)
68 cmd->rsp.arg3 = QLCRD32(adapter,
69 QLCNIC_ARG3_CRB_OFFSET);
65 } 70 }
66 if (rd_args[0]) 71 if (cmd->rsp.arg1)
67 *rd_args[0] = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET); 72 cmd->rsp.arg1 = QLCRD32(adapter, QLCNIC_ARG1_CRB_OFFSET);
68 73
69 /* Release semaphore */ 74 /* Release semaphore */
70 qlcnic_api_unlock(adapter); 75 qlcnic_api_unlock(adapter);
71 76
72 return rcode;
73} 77}
74 78
75static uint32_t qlcnic_temp_checksum(uint32_t *temp_buffer, u16 temp_size) 79static uint32_t qlcnic_temp_checksum(uint32_t *temp_buffer, u16 temp_size)
@@ -88,30 +92,25 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter)
88 int err, i; 92 int err, i;
89 u16 temp_size; 93 u16 temp_size;
90 void *tmp_addr; 94 void *tmp_addr;
91 u32 version, csum, *template, *tmp_buf, rsp; 95 u32 version, csum, *template, *tmp_buf;
92 u32 *rd_args[3]; 96 struct qlcnic_cmd_args cmd;
93 struct qlcnic_hardware_context *ahw; 97 struct qlcnic_hardware_context *ahw;
94 struct qlcnic_dump_template_hdr *tmpl_hdr, *tmp_tmpl; 98 struct qlcnic_dump_template_hdr *tmpl_hdr, *tmp_tmpl;
95 dma_addr_t tmp_addr_t = 0; 99 dma_addr_t tmp_addr_t = 0;
96 100
97 ahw = adapter->ahw; 101 ahw = adapter->ahw;
98 rd_args[0] = &rsp; 102 memset(&cmd, 0, sizeof(cmd));
99 rd_args[1] = (u32 *) &temp_size; 103 cmd.req.cmd = QLCNIC_CDRP_CMD_TEMP_SIZE;
100 rd_args[2] = &version; 104 memset(&cmd.rsp, 1, sizeof(struct _cdrp_cmd));
101 err = qlcnic_issue_cmd(adapter, 105 qlcnic_issue_cmd(adapter, &cmd);
102 adapter->ahw->pci_func, 106 if (cmd.rsp.cmd != QLCNIC_RCODE_SUCCESS) {
103 adapter->fw_hal_version,
104 0,
105 0,
106 0,
107 QLCNIC_CDRP_CMD_TEMP_SIZE,
108 rd_args);
109 if (err != QLCNIC_RCODE_SUCCESS) {
110 dev_info(&adapter->pdev->dev, 107 dev_info(&adapter->pdev->dev,
111 "Can't get template size %d\n", rsp); 108 "Can't get template size %d\n", cmd.rsp.cmd);
112 err = -EIO; 109 err = -EIO;
113 return err; 110 return err;
114 } 111 }
112 temp_size = cmd.rsp.arg2;
113 version = cmd.rsp.arg3;
115 if (!temp_size) 114 if (!temp_size)
116 return -EIO; 115 return -EIO;
117 116
@@ -122,16 +121,14 @@ int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter)
122 "Can't get memory for FW dump template\n"); 121 "Can't get memory for FW dump template\n");
123 return -ENOMEM; 122 return -ENOMEM;
124 } 123 }
125 memset(rd_args, 0, sizeof(rd_args)); 124 memset(&cmd.rsp, 0, sizeof(struct _cdrp_cmd));
126 err = qlcnic_issue_cmd(adapter, 125 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_TEMP_HDR;
127 adapter->ahw->pci_func, 126 cmd.req.arg1 = LSD(tmp_addr_t);
128 adapter->fw_hal_version, 127 cmd.req.arg2 = MSD(tmp_addr_t);
129 LSD(tmp_addr_t), 128 cmd.req.arg3 = temp_size;
130 MSD(tmp_addr_t), 129 qlcnic_issue_cmd(adapter, &cmd);
131 temp_size, 130
132 QLCNIC_CDRP_CMD_GET_TEMP_HDR, 131 err = cmd.rsp.cmd;
133 rd_args);
134
135 if (err != QLCNIC_RCODE_SUCCESS) { 132 if (err != QLCNIC_RCODE_SUCCESS) {
136 dev_err(&adapter->pdev->dev, 133 dev_err(&adapter->pdev->dev,
137 "Failed to get mini dump template header %d\n", err); 134 "Failed to get mini dump template header %d\n", err);
@@ -167,20 +164,17 @@ error:
167int 164int
168qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu) 165qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu)
169{ 166{
170 u32 *rd_args[3]; 167 struct qlcnic_cmd_args cmd;
171 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 168 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
172 169
173 memset(rd_args, 0, sizeof(rd_args)); 170 memset(&cmd, 0, sizeof(cmd));
171 cmd.req.cmd = QLCNIC_CDRP_CMD_SET_MTU;
172 cmd.req.arg1 = recv_ctx->context_id;
173 cmd.req.arg2 = mtu;
174 cmd.req.arg3 = 0;
174 if (recv_ctx->state == QLCNIC_HOST_CTX_STATE_ACTIVE) { 175 if (recv_ctx->state == QLCNIC_HOST_CTX_STATE_ACTIVE) {
175 if (qlcnic_issue_cmd(adapter, 176 qlcnic_issue_cmd(adapter, &cmd);
176 adapter->ahw->pci_func, 177 if (cmd.rsp.cmd) {
177 adapter->fw_hal_version,
178 recv_ctx->context_id,
179 mtu,
180 0,
181 QLCNIC_CDRP_CMD_SET_MTU,
182 rd_args)) {
183
184 dev_err(&adapter->pdev->dev, "Failed to set mtu\n"); 178 dev_err(&adapter->pdev->dev, "Failed to set mtu\n");
185 return -EIO; 179 return -EIO;
186 } 180 }
@@ -201,6 +195,7 @@ qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
201 struct qlcnic_cardrsp_sds_ring *prsp_sds; 195 struct qlcnic_cardrsp_sds_ring *prsp_sds;
202 struct qlcnic_host_rds_ring *rds_ring; 196 struct qlcnic_host_rds_ring *rds_ring;
203 struct qlcnic_host_sds_ring *sds_ring; 197 struct qlcnic_host_sds_ring *sds_ring;
198 struct qlcnic_cmd_args cmd;
204 199
205 dma_addr_t hostrq_phys_addr, cardrsp_phys_addr; 200 dma_addr_t hostrq_phys_addr, cardrsp_phys_addr;
206 u64 phys_addr; 201 u64 phys_addr;
@@ -208,7 +203,6 @@ qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
208 u8 i, nrds_rings, nsds_rings; 203 u8 i, nrds_rings, nsds_rings;
209 size_t rq_size, rsp_size; 204 size_t rq_size, rsp_size;
210 u32 cap, reg, val, reg2; 205 u32 cap, reg, val, reg2;
211 u32 *rd_args[3];
212 int err; 206 int err;
213 207
214 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 208 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
@@ -290,15 +284,13 @@ qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
290 } 284 }
291 285
292 phys_addr = hostrq_phys_addr; 286 phys_addr = hostrq_phys_addr;
293 memset(rd_args, 0, sizeof(rd_args)); 287 memset(&cmd, 0, sizeof(cmd));
294 err = qlcnic_issue_cmd(adapter, 288 cmd.req.arg1 = (u32) (phys_addr >> 32);
295 adapter->ahw->pci_func, 289 cmd.req.arg2 = (u32) (phys_addr & 0xffffffff);
296 adapter->fw_hal_version, 290 cmd.req.arg3 = rq_size;
297 (u32)(phys_addr >> 32), 291 cmd.req.cmd = QLCNIC_CDRP_CMD_CREATE_RX_CTX;
298 (u32)(phys_addr & 0xffffffff), 292 qlcnic_issue_cmd(adapter, &cmd);
299 rq_size, 293 err = cmd.rsp.cmd;
300 QLCNIC_CDRP_CMD_CREATE_RX_CTX,
301 rd_args);
302 if (err) { 294 if (err) {
303 dev_err(&adapter->pdev->dev, 295 dev_err(&adapter->pdev->dev,
304 "Failed to create rx ctx in firmware%d\n", err); 296 "Failed to create rx ctx in firmware%d\n", err);
@@ -344,22 +336,18 @@ out_free_rq:
344static void 336static void
345qlcnic_fw_cmd_destroy_rx_ctx(struct qlcnic_adapter *adapter) 337qlcnic_fw_cmd_destroy_rx_ctx(struct qlcnic_adapter *adapter)
346{ 338{
347 u32 *rd_args[3]; 339 struct qlcnic_cmd_args cmd;
348 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 340 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
349 341
350 memset(rd_args, 0, sizeof(rd_args)); 342 memset(&cmd, 0, sizeof(cmd));
351 if (qlcnic_issue_cmd(adapter, 343 cmd.req.arg1 = recv_ctx->context_id;
352 adapter->ahw->pci_func, 344 cmd.req.arg2 = QLCNIC_DESTROY_CTX_RESET;
353 adapter->fw_hal_version, 345 cmd.req.arg3 = 0;
354 recv_ctx->context_id, 346 cmd.req.cmd = QLCNIC_CDRP_CMD_DESTROY_RX_CTX;
355 QLCNIC_DESTROY_CTX_RESET, 347 qlcnic_issue_cmd(adapter, &cmd);
356 0, 348 if (cmd.rsp.cmd)
357 QLCNIC_CDRP_CMD_DESTROY_RX_CTX,
358 rd_args)) {
359
360 dev_err(&adapter->pdev->dev, 349 dev_err(&adapter->pdev->dev,
361 "Failed to destroy rx ctx in firmware\n"); 350 "Failed to destroy rx ctx in firmware\n");
362 }
363 351
364 recv_ctx->state = QLCNIC_HOST_CTX_STATE_FREED; 352 recv_ctx->state = QLCNIC_HOST_CTX_STATE_FREED;
365} 353}
@@ -373,7 +361,7 @@ qlcnic_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter)
373 void *rq_addr, *rsp_addr; 361 void *rq_addr, *rsp_addr;
374 size_t rq_size, rsp_size; 362 size_t rq_size, rsp_size;
375 u32 temp; 363 u32 temp;
376 u32 *rd_args[3]; 364 struct qlcnic_cmd_args cmd;
377 int err; 365 int err;
378 u64 phys_addr; 366 u64 phys_addr;
379 dma_addr_t rq_phys_addr, rsp_phys_addr; 367 dma_addr_t rq_phys_addr, rsp_phys_addr;
@@ -423,15 +411,13 @@ qlcnic_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter)
423 prq_cds->ring_size = cpu_to_le32(tx_ring->num_desc); 411 prq_cds->ring_size = cpu_to_le32(tx_ring->num_desc);
424 412
425 phys_addr = rq_phys_addr; 413 phys_addr = rq_phys_addr;
426 memset(rd_args, 0, sizeof(rd_args)); 414 memset(&cmd, 0, sizeof(cmd));
427 err = qlcnic_issue_cmd(adapter, 415 cmd.req.arg1 = (u32)(phys_addr >> 32);
428 adapter->ahw->pci_func, 416 cmd.req.arg2 = ((u32)phys_addr & 0xffffffff);
429 adapter->fw_hal_version, 417 cmd.req.arg3 = rq_size;
430 (u32)(phys_addr >> 32), 418 cmd.req.cmd = QLCNIC_CDRP_CMD_CREATE_TX_CTX;
431 ((u32)phys_addr & 0xffffffff), 419 qlcnic_issue_cmd(adapter, &cmd);
432 rq_size, 420 err = cmd.rsp.cmd;
433 QLCNIC_CDRP_CMD_CREATE_TX_CTX,
434 rd_args);
435 421
436 if (err == QLCNIC_RCODE_SUCCESS) { 422 if (err == QLCNIC_RCODE_SUCCESS) {
437 temp = le32_to_cpu(prsp->cds_ring.host_producer_crb); 423 temp = le32_to_cpu(prsp->cds_ring.host_producer_crb);
@@ -457,37 +443,30 @@ out_free_rq:
457static void 443static void
458qlcnic_fw_cmd_destroy_tx_ctx(struct qlcnic_adapter *adapter) 444qlcnic_fw_cmd_destroy_tx_ctx(struct qlcnic_adapter *adapter)
459{ 445{
460 u32 *rd_args[3]; 446 struct qlcnic_cmd_args cmd;
461 447
462 memset(rd_args, 0, sizeof(rd_args)); 448 memset(&cmd, 0, sizeof(cmd));
463 if (qlcnic_issue_cmd(adapter, 449 cmd.req.arg1 = adapter->tx_context_id;
464 adapter->ahw->pci_func, 450 cmd.req.arg2 = QLCNIC_DESTROY_CTX_RESET;
465 adapter->fw_hal_version, 451 cmd.req.arg3 = 0;
466 adapter->tx_context_id, 452 cmd.req.cmd = QLCNIC_CDRP_CMD_DESTROY_TX_CTX;
467 QLCNIC_DESTROY_CTX_RESET, 453 qlcnic_issue_cmd(adapter, &cmd);
468 0, 454 if (cmd.rsp.cmd)
469 QLCNIC_CDRP_CMD_DESTROY_TX_CTX,
470 rd_args)) {
471
472 dev_err(&adapter->pdev->dev, 455 dev_err(&adapter->pdev->dev,
473 "Failed to destroy tx ctx in firmware\n"); 456 "Failed to destroy tx ctx in firmware\n");
474 }
475} 457}
476 458
477int 459int
478qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config) 460qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config)
479{ 461{
480 u32 *rd_args[3]; 462 struct qlcnic_cmd_args cmd;
481 463
482 memset(rd_args, 0, sizeof(rd_args)); 464 memset(&cmd, 0, sizeof(cmd));
483 return qlcnic_issue_cmd(adapter, 465 cmd.req.arg1 = config;
484 adapter->ahw->pci_func, 466 cmd.req.cmd = QLCNIC_CDRP_CMD_CONFIG_PORT;
485 adapter->fw_hal_version, 467 qlcnic_issue_cmd(adapter, &cmd);
486 config, 468
487 0, 469 return cmd.rsp.cmd;
488 0,
489 QLCNIC_CDRP_CMD_CONFIG_PORT,
490 rd_args);
491} 470}
492 471
493int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter) 472int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter)
@@ -652,24 +631,17 @@ void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter)
652int qlcnic_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac) 631int qlcnic_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac)
653{ 632{
654 int err; 633 int err;
655 u32 arg1, rd_arg1, rd_arg2; 634 struct qlcnic_cmd_args cmd;
656 u32 *rd_args[3]; 635
657 636 memset(&cmd, 0, sizeof(cmd));
658 arg1 = adapter->ahw->pci_func | BIT_8; 637 cmd.req.arg1 = adapter->ahw->pci_func | BIT_8;
659 rd_args[0] = &rd_arg1; 638 cmd.req.cmd = QLCNIC_CDRP_CMD_MAC_ADDRESS;
660 rd_args[1] = &rd_arg2; 639 cmd.rsp.arg1 = cmd.rsp.arg2 = 1;
661 rd_args[2] = 0; 640 qlcnic_issue_cmd(adapter, &cmd);
662 err = qlcnic_issue_cmd(adapter, 641 err = cmd.rsp.cmd;
663 adapter->ahw->pci_func,
664 adapter->fw_hal_version,
665 arg1,
666 0,
667 0,
668 QLCNIC_CDRP_CMD_MAC_ADDRESS,
669 rd_args);
670 642
671 if (err == QLCNIC_RCODE_SUCCESS) 643 if (err == QLCNIC_RCODE_SUCCESS)
672 qlcnic_fetch_mac(adapter, rd_arg1, rd_arg2, 0, mac); 644 qlcnic_fetch_mac(adapter, cmd.rsp.arg1, cmd.rsp.arg2, 0, mac);
673 else { 645 else {
674 dev_err(&adapter->pdev->dev, 646 dev_err(&adapter->pdev->dev,
675 "Failed to get mac address%d\n", err); 647 "Failed to get mac address%d\n", err);
@@ -687,7 +659,7 @@ int qlcnic_get_nic_info(struct qlcnic_adapter *adapter,
687 dma_addr_t nic_dma_t; 659 dma_addr_t nic_dma_t;
688 struct qlcnic_info *nic_info; 660 struct qlcnic_info *nic_info;
689 void *nic_info_addr; 661 void *nic_info_addr;
690 u32 *rd_args[3]; 662 struct qlcnic_cmd_args cmd;
691 size_t nic_size = sizeof(struct qlcnic_info); 663 size_t nic_size = sizeof(struct qlcnic_info);
692 664
693 nic_info_addr = dma_alloc_coherent(&adapter->pdev->dev, nic_size, 665 nic_info_addr = dma_alloc_coherent(&adapter->pdev->dev, nic_size,
@@ -697,15 +669,13 @@ int qlcnic_get_nic_info(struct qlcnic_adapter *adapter,
697 memset(nic_info_addr, 0, nic_size); 669 memset(nic_info_addr, 0, nic_size);
698 670
699 nic_info = nic_info_addr; 671 nic_info = nic_info_addr;
700 memset(rd_args, 0, sizeof(rd_args)); 672 memset(&cmd, 0, sizeof(cmd));
701 err = qlcnic_issue_cmd(adapter, 673 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_NIC_INFO;
702 adapter->ahw->pci_func, 674 cmd.req.arg1 = MSD(nic_dma_t);
703 adapter->fw_hal_version, 675 cmd.req.arg2 = LSD(nic_dma_t);
704 MSD(nic_dma_t), 676 cmd.req.arg3 = (func_id << 16 | nic_size);
705 LSD(nic_dma_t), 677 qlcnic_issue_cmd(adapter, &cmd);
706 (func_id << 16 | nic_size), 678 err = cmd.rsp.cmd;
707 QLCNIC_CDRP_CMD_GET_NIC_INFO,
708 rd_args);
709 679
710 if (err == QLCNIC_RCODE_SUCCESS) { 680 if (err == QLCNIC_RCODE_SUCCESS) {
711 npar_info->pci_func = le16_to_cpu(nic_info->pci_func); 681 npar_info->pci_func = le16_to_cpu(nic_info->pci_func);
@@ -744,7 +714,7 @@ int qlcnic_set_nic_info(struct qlcnic_adapter *adapter, struct qlcnic_info *nic)
744 int err = -EIO; 714 int err = -EIO;
745 dma_addr_t nic_dma_t; 715 dma_addr_t nic_dma_t;
746 void *nic_info_addr; 716 void *nic_info_addr;
747 u32 *rd_args[3]; 717 struct qlcnic_cmd_args cmd;
748 struct qlcnic_info *nic_info; 718 struct qlcnic_info *nic_info;
749 size_t nic_size = sizeof(struct qlcnic_info); 719 size_t nic_size = sizeof(struct qlcnic_info);
750 720
@@ -770,15 +740,13 @@ int qlcnic_set_nic_info(struct qlcnic_adapter *adapter, struct qlcnic_info *nic)
770 nic_info->min_tx_bw = cpu_to_le16(nic->min_tx_bw); 740 nic_info->min_tx_bw = cpu_to_le16(nic->min_tx_bw);
771 nic_info->max_tx_bw = cpu_to_le16(nic->max_tx_bw); 741 nic_info->max_tx_bw = cpu_to_le16(nic->max_tx_bw);
772 742
773 memset(rd_args, 0, sizeof(rd_args)); 743 memset(&cmd, 0, sizeof(cmd));
774 err = qlcnic_issue_cmd(adapter, 744 cmd.req.cmd = QLCNIC_CDRP_CMD_SET_NIC_INFO;
775 adapter->ahw->pci_func, 745 cmd.req.arg1 = MSD(nic_dma_t);
776 adapter->fw_hal_version, 746 cmd.req.arg2 = LSD(nic_dma_t);
777 MSD(nic_dma_t), 747 cmd.req.arg3 = ((nic->pci_func << 16) | nic_size);
778 LSD(nic_dma_t), 748 qlcnic_issue_cmd(adapter, &cmd);
779 ((nic->pci_func << 16) | nic_size), 749 err = cmd.rsp.cmd;
780 QLCNIC_CDRP_CMD_SET_NIC_INFO,
781 rd_args);
782 750
783 if (err != QLCNIC_RCODE_SUCCESS) { 751 if (err != QLCNIC_RCODE_SUCCESS) {
784 dev_err(&adapter->pdev->dev, 752 dev_err(&adapter->pdev->dev,
@@ -796,7 +764,7 @@ int qlcnic_get_pci_info(struct qlcnic_adapter *adapter,
796 struct qlcnic_pci_info *pci_info) 764 struct qlcnic_pci_info *pci_info)
797{ 765{
798 int err = 0, i; 766 int err = 0, i;
799 u32 *rd_args[3]; 767 struct qlcnic_cmd_args cmd;
800 dma_addr_t pci_info_dma_t; 768 dma_addr_t pci_info_dma_t;
801 struct qlcnic_pci_info *npar; 769 struct qlcnic_pci_info *npar;
802 void *pci_info_addr; 770 void *pci_info_addr;
@@ -810,15 +778,13 @@ int qlcnic_get_pci_info(struct qlcnic_adapter *adapter,
810 memset(pci_info_addr, 0, pci_size); 778 memset(pci_info_addr, 0, pci_size);
811 779
812 npar = pci_info_addr; 780 npar = pci_info_addr;
813 memset(rd_args, 0, sizeof(rd_args)); 781 memset(&cmd, 0, sizeof(cmd));
814 err = qlcnic_issue_cmd(adapter, 782 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_PCI_INFO;
815 adapter->ahw->pci_func, 783 cmd.req.arg1 = MSD(pci_info_dma_t);
816 adapter->fw_hal_version, 784 cmd.req.arg2 = LSD(pci_info_dma_t);
817 MSD(pci_info_dma_t), 785 cmd.req.arg3 = pci_size;
818 LSD(pci_info_dma_t), 786 qlcnic_issue_cmd(adapter, &cmd);
819 pci_size, 787 err = cmd.rsp.cmd;
820 QLCNIC_CDRP_CMD_GET_PCI_INFO,
821 rd_args);
822 788
823 if (err == QLCNIC_RCODE_SUCCESS) { 789 if (err == QLCNIC_RCODE_SUCCESS) {
824 for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++, npar++, pci_info++) { 790 for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++, npar++, pci_info++) {
@@ -850,7 +816,7 @@ int qlcnic_config_port_mirroring(struct qlcnic_adapter *adapter, u8 id,
850{ 816{
851 int err = -EIO; 817 int err = -EIO;
852 u32 arg1; 818 u32 arg1;
853 u32 *rd_args[3]; 819 struct qlcnic_cmd_args cmd;
854 820
855 if (adapter->op_mode != QLCNIC_MGMT_FUNC || 821 if (adapter->op_mode != QLCNIC_MGMT_FUNC ||
856 !(adapter->eswitch[id].flags & QLCNIC_SWITCH_ENABLE)) 822 !(adapter->eswitch[id].flags & QLCNIC_SWITCH_ENABLE))
@@ -859,15 +825,11 @@ int qlcnic_config_port_mirroring(struct qlcnic_adapter *adapter, u8 id,
859 arg1 = id | (enable_mirroring ? BIT_4 : 0); 825 arg1 = id | (enable_mirroring ? BIT_4 : 0);
860 arg1 |= pci_func << 8; 826 arg1 |= pci_func << 8;
861 827
862 memset(rd_args, 0, sizeof(rd_args)); 828 memset(&cmd, 0, sizeof(cmd));
863 err = qlcnic_issue_cmd(adapter, 829 cmd.req.cmd = QLCNIC_CDRP_CMD_SET_PORTMIRRORING;
864 adapter->ahw->pci_func, 830 cmd.req.arg1 = arg1;
865 adapter->fw_hal_version, 831 qlcnic_issue_cmd(adapter, &cmd);
866 arg1, 832 err = cmd.rsp.cmd;
867 0,
868 0,
869 QLCNIC_CDRP_CMD_SET_PORTMIRRORING,
870 rd_args);
871 833
872 if (err != QLCNIC_RCODE_SUCCESS) { 834 if (err != QLCNIC_RCODE_SUCCESS) {
873 dev_err(&adapter->pdev->dev, 835 dev_err(&adapter->pdev->dev,
@@ -890,7 +852,7 @@ int qlcnic_get_port_stats(struct qlcnic_adapter *adapter, const u8 func,
890 dma_addr_t stats_dma_t; 852 dma_addr_t stats_dma_t;
891 void *stats_addr; 853 void *stats_addr;
892 u32 arg1; 854 u32 arg1;
893 u32 *rd_args[3]; 855 struct qlcnic_cmd_args cmd;
894 int err; 856 int err;
895 857
896 if (esw_stats == NULL) 858 if (esw_stats == NULL)
@@ -914,15 +876,13 @@ int qlcnic_get_port_stats(struct qlcnic_adapter *adapter, const u8 func,
914 arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12; 876 arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12;
915 arg1 |= rx_tx << 15 | stats_size << 16; 877 arg1 |= rx_tx << 15 | stats_size << 16;
916 878
917 memset(rd_args, 0, sizeof(rd_args)); 879 memset(&cmd, 0, sizeof(cmd));
918 err = qlcnic_issue_cmd(adapter, 880 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_ESWITCH_STATS;
919 adapter->ahw->pci_func, 881 cmd.req.arg1 = arg1;
920 adapter->fw_hal_version, 882 cmd.req.arg2 = MSD(stats_dma_t);
921 arg1, 883 cmd.req.arg3 = LSD(stats_dma_t);
922 MSD(stats_dma_t), 884 qlcnic_issue_cmd(adapter, &cmd);
923 LSD(stats_dma_t), 885 err = cmd.rsp.cmd;
924 QLCNIC_CDRP_CMD_GET_ESWITCH_STATS,
925 rd_args);
926 886
927 if (!err) { 887 if (!err) {
928 stats = stats_addr; 888 stats = stats_addr;
@@ -1003,7 +963,7 @@ int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, const u8 func_esw,
1003{ 963{
1004 964
1005 u32 arg1; 965 u32 arg1;
1006 u32 *rd_args[3]; 966 struct qlcnic_cmd_args cmd;
1007 967
1008 if (adapter->op_mode != QLCNIC_MGMT_FUNC) 968 if (adapter->op_mode != QLCNIC_MGMT_FUNC)
1009 return -EIO; 969 return -EIO;
@@ -1024,15 +984,11 @@ int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, const u8 func_esw,
1024 arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12; 984 arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12;
1025 arg1 |= BIT_14 | rx_tx << 15; 985 arg1 |= BIT_14 | rx_tx << 15;
1026 986
1027 memset(rd_args, 0, sizeof(rd_args)); 987 memset(&cmd, 0, sizeof(cmd));
1028 return qlcnic_issue_cmd(adapter, 988 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_ESWITCH_STATS;
1029 adapter->ahw->pci_func, 989 cmd.req.arg1 = arg1;
1030 adapter->fw_hal_version, 990 qlcnic_issue_cmd(adapter, &cmd);
1031 arg1, 991 return cmd.rsp.cmd;
1032 0,
1033 0,
1034 QLCNIC_CDRP_CMD_GET_ESWITCH_STATS,
1035 rd_args);
1036 992
1037err_ret: 993err_ret:
1038 dev_err(&adapter->pdev->dev, "Invalid argument func_esw=%d port=%d" 994 dev_err(&adapter->pdev->dev, "Invalid argument func_esw=%d port=%d"
@@ -1045,20 +1001,17 @@ __qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter,
1045 u32 *arg1, u32 *arg2) 1001 u32 *arg1, u32 *arg2)
1046{ 1002{
1047 int err = -EIO; 1003 int err = -EIO;
1048 u32 *rd_args[3]; 1004 struct qlcnic_cmd_args cmd;
1049 u8 pci_func; 1005 u8 pci_func;
1050 pci_func = (*arg1 >> 8); 1006 pci_func = (*arg1 >> 8);
1051 rd_args[0] = arg1; 1007
1052 rd_args[1] = arg2; 1008 cmd.req.cmd = QLCNIC_CDRP_CMD_GET_ESWITCH_PORT_CONFIG;
1053 rd_args[2] = 0; 1009 cmd.req.arg1 = *arg1;
1054 err = qlcnic_issue_cmd(adapter, 1010 cmd.rsp.arg1 = cmd.rsp.arg2 = 1;
1055 adapter->ahw->pci_func, 1011 qlcnic_issue_cmd(adapter, &cmd);
1056 adapter->fw_hal_version, 1012 *arg1 = cmd.rsp.arg1;
1057 *arg1, 1013 *arg2 = cmd.rsp.arg2;
1058 0, 1014 err = cmd.rsp.cmd;
1059 0,
1060 QLCNIC_CDRP_CMD_GET_ESWITCH_PORT_CONFIG,
1061 rd_args);
1062 1015
1063 if (err == QLCNIC_RCODE_SUCCESS) { 1016 if (err == QLCNIC_RCODE_SUCCESS) {
1064 dev_info(&adapter->pdev->dev, 1017 dev_info(&adapter->pdev->dev,
@@ -1082,7 +1035,7 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
1082{ 1035{
1083 int err = -EIO; 1036 int err = -EIO;
1084 u32 arg1, arg2 = 0; 1037 u32 arg1, arg2 = 0;
1085 u32 *rd_args[3]; 1038 struct qlcnic_cmd_args cmd;
1086 u8 pci_func; 1039 u8 pci_func;
1087 1040
1088 if (adapter->op_mode != QLCNIC_MGMT_FUNC) 1041 if (adapter->op_mode != QLCNIC_MGMT_FUNC)
@@ -1129,16 +1082,13 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
1129 return err; 1082 return err;
1130 } 1083 }
1131 1084
1132 memset(rd_args, 0, sizeof(rd_args)); 1085 memset(&cmd, 0, sizeof(cmd));
1133 err = qlcnic_issue_cmd(adapter, 1086 cmd.req.cmd = QLCNIC_CDRP_CMD_CONFIGURE_ESWITCH;
1134 adapter->ahw->pci_func, 1087 cmd.req.arg1 = arg1;
1135 adapter->fw_hal_version, 1088 cmd.req.arg2 = arg2;
1136 arg1, 1089 qlcnic_issue_cmd(adapter, &cmd);
1137 arg2,
1138 0,
1139 QLCNIC_CDRP_CMD_CONFIGURE_ESWITCH,
1140 rd_args);
1141 1090
1091 err = cmd.rsp.cmd;
1142 if (err != QLCNIC_RCODE_SUCCESS) { 1092 if (err != QLCNIC_RCODE_SUCCESS) {
1143 dev_err(&adapter->pdev->dev, 1093 dev_err(&adapter->pdev->dev,
1144 "Failed to configure eswitch pci func %d\n", pci_func); 1094 "Failed to configure eswitch pci func %d\n", pci_func);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index b127f809421b..11f4df75e84c 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -659,7 +659,7 @@ static int qlcnic_irq_test(struct net_device *netdev)
659 struct qlcnic_adapter *adapter = netdev_priv(netdev); 659 struct qlcnic_adapter *adapter = netdev_priv(netdev);
660 int max_sds_rings = adapter->max_sds_rings; 660 int max_sds_rings = adapter->max_sds_rings;
661 int ret; 661 int ret;
662 u32 *rd_args[3]; 662 struct qlcnic_cmd_args cmd;
663 663
664 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 664 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
665 return -EIO; 665 return -EIO;
@@ -669,10 +669,12 @@ static int qlcnic_irq_test(struct net_device *netdev)
669 goto clear_it; 669 goto clear_it;
670 670
671 adapter->diag_cnt = 0; 671 adapter->diag_cnt = 0;
672 memset(rd_args, 0, sizeof(rd_args)); 672 memset(&cmd, 0, sizeof(cmd));
673 ret = qlcnic_issue_cmd(adapter, adapter->ahw->pci_func, 673 cmd.req.cmd = QLCNIC_CDRP_CMD_INTRPT_TEST;
674 adapter->fw_hal_version, adapter->ahw->pci_func, 674 cmd.req.arg1 = adapter->ahw->pci_func;
675 0, 0, 0x00000011, rd_args); 675 qlcnic_issue_cmd(adapter, &cmd);
676 ret = cmd.rsp.cmd;
677
676 if (ret) 678 if (ret)
677 goto done; 679 goto done;
678 680