Commit 283c1c68 authored by Manish chopra's avatar Manish chopra Committed by David S. Miller
Browse files

qlcnic: driver LRO bug fix



o ipv4 address was not getting programmed properly because of
  improper byte order conversion
Signed-off-by: default avatarManish chopra <manish.chopra@qlogic.com>
Signed-off-by: default avatarJitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cdc84dda
...@@ -1399,7 +1399,7 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip, ...@@ -1399,7 +1399,7 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
int mode) int mode)
{ {
int err; int err;
u32 temp; u32 temp, temp_ip;
struct qlcnic_cmd_args cmd; struct qlcnic_cmd_args cmd;
qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_IP_ADDR); 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,8 +1410,17 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
temp = adapter->recv_ctx->context_id << 16; temp = adapter->recv_ctx->context_id << 16;
cmd.req.arg[1] = 2 | temp; cmd.req.arg[1] = 2 | temp;
} }
cmd.req.arg[2] = ntohl(ip);
/*
* Adapter needs IP address in network byte order.
* But hardware mailbox registers go through writel(), hence IP address
* gets swapped on big endian architecture.
* To negate swapping of writel() on big endian architecture
* use swab32(value).
*/
temp_ip = swab32(ntohl(ip));
memcpy(&cmd.req.arg[2], &temp_ip, sizeof(u32));
err = qlcnic_issue_cmd(adapter, &cmd); err = qlcnic_issue_cmd(adapter, &cmd);
if (err != QLCNIC_RCODE_SUCCESS) if (err != QLCNIC_RCODE_SUCCESS)
dev_err(&adapter->netdev->dev, dev_err(&adapter->netdev->dev,
...@@ -1425,13 +1434,16 @@ int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode) ...@@ -1425,13 +1434,16 @@ int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode)
int err; int err;
u32 temp, arg1; u32 temp, arg1;
struct qlcnic_cmd_args cmd; struct qlcnic_cmd_args cmd;
int lro_bit_mask;
lro_bit_mask = (mode ? (BIT_0 | BIT_1 | BIT_2 | BIT_3) : 0);
if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
return 0; return 0;
qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO); qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
temp = adapter->recv_ctx->context_id << 16; temp = adapter->recv_ctx->context_id << 16;
arg1 = (mode ? (BIT_0 | BIT_1 | BIT_3) : 0) | temp; arg1 = lro_bit_mask | temp;
cmd.req.arg[1] = arg1; cmd.req.arg[1] = arg1;
err = qlcnic_issue_cmd(adapter, &cmd); err = qlcnic_issue_cmd(adapter, &cmd);
......
...@@ -958,8 +958,10 @@ int qlcnic_set_features(struct net_device *netdev, netdev_features_t features) ...@@ -958,8 +958,10 @@ int qlcnic_set_features(struct net_device *netdev, netdev_features_t features)
if (qlcnic_config_hw_lro(adapter, hw_lro)) if (qlcnic_config_hw_lro(adapter, hw_lro))
return -EIO; return -EIO;
if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter)) if (!hw_lro && qlcnic_82xx_check(adapter)) {
return -EIO; if (qlcnic_send_lro_cleanup(adapter))
return -EIO;
}
return 0; return 0;
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment