aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManish chopra <manish.chopra@qlogic.com>2013-01-30 07:47:15 -0500
committerDavid S. Miller <davem@davemloft.net>2013-01-30 20:34:50 -0500
commit283c1c687051241e644af57bef7b6532cd65118a (patch)
tree3f58307dc3dcc3dc32083746fa748a968b48fc14
parentcdc84dda1e0214960df14aaee6708993b40e28f0 (diff)
qlcnic: driver LRO bug fix
o ipv4 address was not getting programmed properly because of improper byte order conversion Signed-off-by: Manish chopra <manish.chopra@qlogic.com> Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c18
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c6
2 files changed, 19 insertions, 5 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 1e81e94b3c6b..65233c846537 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -1399,7 +1399,7 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
1399 int mode) 1399 int mode)
1400{ 1400{
1401 int err; 1401 int err;
1402 u32 temp; 1402 u32 temp, temp_ip;
1403 struct qlcnic_cmd_args cmd; 1403 struct qlcnic_cmd_args cmd;
1404 1404
1405 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_IP_ADDR); 1405 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_IP_ADDR);
@@ -1410,8 +1410,17 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
1410 temp = adapter->recv_ctx->context_id << 16; 1410 temp = adapter->recv_ctx->context_id << 16;
1411 cmd.req.arg[1] = 2 | temp; 1411 cmd.req.arg[1] = 2 | temp;
1412 } 1412 }
1413 cmd.req.arg[2] = ntohl(ip);
1414 1413
1414 /*
1415 * Adapter needs IP address in network byte order.
1416 * But hardware mailbox registers go through writel(), hence IP address
1417 * gets swapped on big endian architecture.
1418 * To negate swapping of writel() on big endian architecture
1419 * use swab32(value).
1420 */
1421
1422 temp_ip = swab32(ntohl(ip));
1423 memcpy(&cmd.req.arg[2], &temp_ip, sizeof(u32));
1415 err = qlcnic_issue_cmd(adapter, &cmd); 1424 err = qlcnic_issue_cmd(adapter, &cmd);
1416 if (err != QLCNIC_RCODE_SUCCESS) 1425 if (err != QLCNIC_RCODE_SUCCESS)
1417 dev_err(&adapter->netdev->dev, 1426 dev_err(&adapter->netdev->dev,
@@ -1425,13 +1434,16 @@ int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode)
1425 int err; 1434 int err;
1426 u32 temp, arg1; 1435 u32 temp, arg1;
1427 struct qlcnic_cmd_args cmd; 1436 struct qlcnic_cmd_args cmd;
1437 int lro_bit_mask;
1438
1439 lro_bit_mask = (mode ? (BIT_0 | BIT_1 | BIT_2 | BIT_3) : 0);
1428 1440
1429 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 1441 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
1430 return 0; 1442 return 0;
1431 1443
1432 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO); 1444 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
1433 temp = adapter->recv_ctx->context_id << 16; 1445 temp = adapter->recv_ctx->context_id << 16;
1434 arg1 = (mode ? (BIT_0 | BIT_1 | BIT_3) : 0) | temp; 1446 arg1 = lro_bit_mask | temp;
1435 cmd.req.arg[1] = arg1; 1447 cmd.req.arg[1] = arg1;
1436 1448
1437 err = qlcnic_issue_cmd(adapter, &cmd); 1449 err = qlcnic_issue_cmd(adapter, &cmd);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 6c6ecfc152b8..4e4ebafac5c9 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -958,8 +958,10 @@ int qlcnic_set_features(struct net_device *netdev, netdev_features_t features)
958 if (qlcnic_config_hw_lro(adapter, hw_lro)) 958 if (qlcnic_config_hw_lro(adapter, hw_lro))
959 return -EIO; 959 return -EIO;
960 960
961 if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter)) 961 if (!hw_lro && qlcnic_82xx_check(adapter)) {
962 return -EIO; 962 if (qlcnic_send_lro_cleanup(adapter))
963 return -EIO;
964 }
963 965
964 return 0; 966 return 0;
965} 967}