Commit d24cd733 authored by David S. Miller's avatar David S. Miller

Merge branch 'be2net-fixes'

Sriharsha Basavapatna says:

====================
be2net: patch-set

The following patch set contains a few bug fixes.
Please consider applying this to the net-next tree.
Thanks.

Patch-1 Obtains proper PF number for BEx chips
Patch-2 Fixes a FW update issue seen with BEx chips
Patch-3 Updates copyright string
Patch-4 Fixes TX stats for TSO packets
Patch-5 Enables VF link state setting for BE3
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2f7c68d8 dc6e8511
...@@ -2728,6 +2728,26 @@ static int be_flash(struct be_adapter *adapter, const u8 *img, ...@@ -2728,6 +2728,26 @@ static int be_flash(struct be_adapter *adapter, const u8 *img,
return 0; return 0;
} }
#define NCSI_UPDATE_LOG "NCSI section update is not supported in FW ver %s\n"
static bool be_fw_ncsi_supported(char *ver)
{
int v1[4] = {3, 102, 148, 0}; /* Min ver that supports NCSI FW */
int v2[4];
int i;
if (sscanf(ver, "%d.%d.%d.%d", &v2[0], &v2[1], &v2[2], &v2[3]) != 4)
return false;
for (i = 0; i < 4; i++) {
if (v1[i] < v2[i])
return true;
else if (v1[i] > v2[i])
return false;
}
return true;
}
/* For BE2, BE3 and BE3-R */ /* For BE2, BE3 and BE3-R */
static int be_flash_BEx(struct be_adapter *adapter, static int be_flash_BEx(struct be_adapter *adapter,
const struct firmware *fw, const struct firmware *fw,
...@@ -2805,8 +2825,10 @@ static int be_flash_BEx(struct be_adapter *adapter, ...@@ -2805,8 +2825,10 @@ static int be_flash_BEx(struct be_adapter *adapter,
continue; continue;
if ((pflashcomp[i].optype == OPTYPE_NCSI_FW) && if ((pflashcomp[i].optype == OPTYPE_NCSI_FW) &&
memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) !be_fw_ncsi_supported(adapter->fw_ver)) {
dev_info(dev, NCSI_UPDATE_LOG, adapter->fw_ver);
continue; continue;
}
if (pflashcomp[i].optype == OPTYPE_PHY_FW && if (pflashcomp[i].optype == OPTYPE_PHY_FW &&
!phy_flashing_required(adapter)) !phy_flashing_required(adapter))
...@@ -3527,6 +3549,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) ...@@ -3527,6 +3549,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++) for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
adapter->serial_num[i] = le32_to_cpu(serial_num[i]) & adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
(BIT_MASK(16) - 1); (BIT_MASK(16) - 1);
/* For BEx, since GET_FUNC_CONFIG command is not
* supported, we read funcnum here as a workaround.
*/
if (BEx_chip(adapter))
adapter->pf_num = attribs->hba_attribs.pci_funcnum;
} }
err: err:
...@@ -4950,7 +4977,7 @@ int be_cmd_set_logical_link_config(struct be_adapter *adapter, ...@@ -4950,7 +4977,7 @@ int be_cmd_set_logical_link_config(struct be_adapter *adapter,
{ {
int status; int status;
if (BEx_chip(adapter)) if (BE2_chip(adapter))
return -EOPNOTSUPP; return -EOPNOTSUPP;
status = __be_cmd_set_logical_link_config(adapter, link_state, status = __be_cmd_set_logical_link_config(adapter, link_state,
......
...@@ -1720,7 +1720,11 @@ struct mgmt_hba_attribs { ...@@ -1720,7 +1720,11 @@ struct mgmt_hba_attribs {
u32 rsvd2[55]; u32 rsvd2[55];
u8 rsvd3[3]; u8 rsvd3[3];
u8 phy_port; u8 phy_port;
u32 rsvd4[13]; u32 rsvd4[15];
u8 rsvd5[2];
u8 pci_funcnum;
u8 rsvd6;
u32 rsvd7[6];
} __packed; } __packed;
struct mgmt_controller_attrib { struct mgmt_controller_attrib {
......
/* /*
* Copyright (C) 2005 - 2015 Emulex * Copyright (C) 2005-2016 Broadcom.
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
......
...@@ -724,14 +724,24 @@ void be_link_status_update(struct be_adapter *adapter, u8 link_status) ...@@ -724,14 +724,24 @@ void be_link_status_update(struct be_adapter *adapter, u8 link_status)
netdev_info(netdev, "Link is %s\n", link_status ? "Up" : "Down"); netdev_info(netdev, "Link is %s\n", link_status ? "Up" : "Down");
} }
static int be_gso_hdr_len(struct sk_buff *skb)
{
if (skb->encapsulation)
return skb_inner_transport_offset(skb) +
inner_tcp_hdrlen(skb);
return skb_transport_offset(skb) + tcp_hdrlen(skb);
}
static void be_tx_stats_update(struct be_tx_obj *txo, struct sk_buff *skb) static void be_tx_stats_update(struct be_tx_obj *txo, struct sk_buff *skb)
{ {
struct be_tx_stats *stats = tx_stats(txo); struct be_tx_stats *stats = tx_stats(txo);
u64 tx_pkts = skb_shinfo(skb)->gso_segs ? : 1; u32 tx_pkts = skb_shinfo(skb)->gso_segs ? : 1;
/* Account for headers which get duplicated in TSO pkt */
u32 dup_hdr_len = tx_pkts > 1 ? be_gso_hdr_len(skb) * (tx_pkts - 1) : 0;
u64_stats_update_begin(&stats->sync); u64_stats_update_begin(&stats->sync);
stats->tx_reqs++; stats->tx_reqs++;
stats->tx_bytes += skb->len; stats->tx_bytes += skb->len + dup_hdr_len;
stats->tx_pkts += tx_pkts; stats->tx_pkts += tx_pkts;
if (skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) if (skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL)
stats->tx_vxlan_offload_pkts += tx_pkts; stats->tx_vxlan_offload_pkts += tx_pkts;
......
Markdown is supported
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