diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 21 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | 374 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 12 |
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 | ||
1362 | struct _cdrp_cmd { | ||
1363 | u32 cmd; | ||
1364 | u32 arg1; | ||
1365 | u32 arg2; | ||
1366 | u32 arg3; | ||
1367 | }; | ||
1368 | |||
1369 | struct qlcnic_cmd_args { | ||
1370 | struct _cdrp_cmd req; | ||
1371 | struct _cdrp_cmd rsp; | ||
1372 | }; | ||
1373 | |||
1361 | int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter); | 1374 | int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter); |
1362 | int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config); | 1375 | int 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 */ |
1472 | int qlcnic_reset_context(struct qlcnic_adapter *); | 1485 | int qlcnic_reset_context(struct qlcnic_adapter *); |
1473 | u32 qlcnic_issue_cmd(struct qlcnic_adapter *adapter, | 1486 | void 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]); | ||
1476 | void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); | 1487 | void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); |
1477 | int qlcnic_diag_alloc_res(struct net_device *netdev, int test); | 1488 | int qlcnic_diag_alloc_res(struct net_device *netdev, int test); |
1478 | netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev); | 1489 | netdev_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 | ||
29 | u32 | 29 | void |
30 | qlcnic_issue_cmd(struct qlcnic_adapter *adapter, | 30 | qlcnic_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 | ||
75 | static uint32_t qlcnic_temp_checksum(uint32_t *temp_buffer, u16 temp_size) | 79 | static 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: | |||
167 | int | 164 | int |
168 | qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu) | 165 | qlcnic_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: | |||
344 | static void | 336 | static void |
345 | qlcnic_fw_cmd_destroy_rx_ctx(struct qlcnic_adapter *adapter) | 337 | qlcnic_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: | |||
457 | static void | 443 | static void |
458 | qlcnic_fw_cmd_destroy_tx_ctx(struct qlcnic_adapter *adapter) | 444 | qlcnic_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 | ||
477 | int | 459 | int |
478 | qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config) | 460 | qlcnic_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 | ||
493 | int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter) | 472 | int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter) |
@@ -652,24 +631,17 @@ void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter) | |||
652 | int qlcnic_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac) | 631 | int 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 | ||
1037 | err_ret: | 993 | err_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 | ||