From patchwork Wed Jan 30 22:47:15 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jitendra Kalsaria X-Patchwork-Id: 217012 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 314F42C0094 for ; Thu, 31 Jan 2013 10:08:30 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932092Ab3A3XIY (ORCPT ); Wed, 30 Jan 2013 18:08:24 -0500 Received: from mvnat01.qlogic.com ([198.186.3.73]:18725 "HELO linux-zupk.site" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with SMTP id S932069Ab3A3XIW (ORCPT ); Wed, 30 Jan 2013 18:08:22 -0500 Received: by linux-zupk.site (Postfix, from userid 0) id DEF3F521FB3; Wed, 30 Jan 2013 17:47:35 -0500 (EST) From: Jitendra Kalsaria To: davem@davemloft.net Cc: netdev@vger.kernel.org, sony.chacko@qlogic.com, Dept_NX_Linux_NIC_Driver@qlogic.com, Manish chopra Subject: [net-next PATCH 4/8] qlcnic: driver LRO bug fix Date: Wed, 30 Jan 2013 17:47:15 -0500 Message-Id: <1359586039-19051-5-git-send-email-jitendra.kalsaria@qlogic.com> X-Mailer: git-send-email 1.7.7 In-Reply-To: <1359586039-19051-1-git-send-email-jitendra.kalsaria@qlogic.com> References: <1359586039-19051-1-git-send-email-jitendra.kalsaria@qlogic.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Manish chopra o ipv4 address was not getting programmed properly because of improper byte order conversion Signed-off-by: Manish chopra Signed-off-by: Jitendra Kalsaria --- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 18 +++++++++++++++--- 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 1e81e94..65233c8 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, int mode) { int err; - u32 temp; + u32 temp, temp_ip; struct qlcnic_cmd_args cmd; 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, temp = adapter->recv_ctx->context_id << 16; 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); if (err != QLCNIC_RCODE_SUCCESS) dev_err(&adapter->netdev->dev, @@ -1425,13 +1434,16 @@ int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode) int err; u32 temp, arg1; 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) return 0; qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO); 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; 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 6c6ecfc..4e4ebaf 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) if (qlcnic_config_hw_lro(adapter, hw_lro)) return -EIO; - if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter)) - return -EIO; + if (!hw_lro && qlcnic_82xx_check(adapter)) { + if (qlcnic_send_lro_cleanup(adapter)) + return -EIO; + } return 0; }