diff options
| author | Manish chopra <manish.chopra@qlogic.com> | 2013-01-30 07:47:15 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-01-30 20:34:50 -0500 |
| commit | 283c1c687051241e644af57bef7b6532cd65118a (patch) | |
| tree | 3f58307dc3dcc3dc32083746fa748a968b48fc14 | |
| parent | cdc84dda1e0214960df14aaee6708993b40e28f0 (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.c | 18 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c | 6 |
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 | } |
