Skip to content

Uek5 master driver update #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions drivers/net/ethernet/emulex/benet/be.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#include "be_hw.h"
#include "be_roce.h"

#define DRV_VER "11.4.0.0"
#define DRV_VER "12.0.0.0"
#define DRV_NAME "be2net"
#define BE_NAME "Emulex BladeEngine2"
#define BE3_NAME "Emulex BladeEngine3"
Expand Down Expand Up @@ -248,6 +248,7 @@ struct be_tx_stats {
u32 tx_spoof_check_err;
u32 tx_qinq_err;
u32 tx_internal_parity_err;
u32 tx_sge_err;
struct u64_stats_sync sync;
struct u64_stats_sync sync_compl;
};
Expand Down Expand Up @@ -944,8 +945,10 @@ static inline bool is_ipv6_ext_hdr(struct sk_buff *skb)
#define BE_ERROR_EEH 1
#define BE_ERROR_UE BIT(1)
#define BE_ERROR_FW BIT(2)
#define BE_ERROR_HW (BE_ERROR_EEH | BE_ERROR_UE)
#define BE_ERROR_ANY (BE_ERROR_EEH | BE_ERROR_UE | BE_ERROR_FW)
#define BE_ERROR_TX BIT(3)
#define BE_ERROR_HW (BE_ERROR_EEH | BE_ERROR_UE | BE_ERROR_TX)
#define BE_ERROR_ANY (BE_ERROR_EEH | BE_ERROR_UE | BE_ERROR_FW | \
BE_ERROR_TX)
#define BE_CLEAR_ALL 0xFF

static inline u8 be_check_error(struct be_adapter *adapter, u32 err_type)
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/emulex/benet/be_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ static const struct be_ethtool_stat et_tx_stats[] = {
* packet data. This counter is applicable only for Lancer adapters.
*/
{DRVSTAT_TX_INFO(tx_internal_parity_err)},
{DRVSTAT_TX_INFO(tx_sge_err)},
{DRVSTAT_TX_INFO(tx_bytes)},
{DRVSTAT_TX_INFO(tx_pkts)},
{DRVSTAT_TX_INFO(tx_vxlan_offload_pkts)},
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/emulex/benet/be_hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ struct be_eth_hdr_wrb {
#define LANCER_TX_COMP_HSW_DROP_MAC_ERR 0x3
#define LANCER_TX_COMP_HSW_DROP_VLAN_ERR 0x5
#define LANCER_TX_COMP_QINQ_ERR 0x7
#define LANCER_TX_COMP_SGE_ERR 0x9
#define LANCER_TX_COMP_PARITY_ERR 0xb
#define LANCER_TX_COMP_DMA_ERR 0xd

Expand Down
113 changes: 66 additions & 47 deletions drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2584,7 +2584,48 @@ static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp, u32 frags_needed)
}
}

static struct be_tx_compl_info *be_tx_compl_get(struct be_tx_obj *txo)
static inline void be_update_tx_err(struct be_tx_obj *txo, u8 status)
{
switch (status) {
case BE_TX_COMP_HDR_PARSE_ERR:
tx_stats(txo)->tx_hdr_parse_err++;
break;
case BE_TX_COMP_NDMA_ERR:
tx_stats(txo)->tx_dma_err++;
break;
case BE_TX_COMP_ACL_ERR:
tx_stats(txo)->tx_spoof_check_err++;
break;
}
}

static inline void lancer_update_tx_err(struct be_tx_obj *txo, u8 status)
{
switch (status) {
case LANCER_TX_COMP_LSO_ERR:
tx_stats(txo)->tx_tso_err++;
break;
case LANCER_TX_COMP_HSW_DROP_MAC_ERR:
case LANCER_TX_COMP_HSW_DROP_VLAN_ERR:
tx_stats(txo)->tx_spoof_check_err++;
break;
case LANCER_TX_COMP_QINQ_ERR:
tx_stats(txo)->tx_qinq_err++;
break;
case LANCER_TX_COMP_PARITY_ERR:
tx_stats(txo)->tx_internal_parity_err++;
break;
case LANCER_TX_COMP_DMA_ERR:
tx_stats(txo)->tx_dma_err++;
break;
case LANCER_TX_COMP_SGE_ERR:
tx_stats(txo)->tx_sge_err++;
break;
}
}

static struct be_tx_compl_info *be_tx_compl_get(struct be_adapter *adapter,
struct be_tx_obj *txo)
{
struct be_queue_info *tx_cq = &txo->cq;
struct be_tx_compl_info *txcp = &txo->txcp;
Expand All @@ -2600,6 +2641,24 @@ static struct be_tx_compl_info *be_tx_compl_get(struct be_tx_obj *txo)
txcp->status = GET_TX_COMPL_BITS(status, compl);
txcp->end_index = GET_TX_COMPL_BITS(wrb_index, compl);

if (txcp->status) {
if (lancer_chip(adapter)) {
lancer_update_tx_err(txo, txcp->status);
/* Reset the adapter incase of TSO,
* SGE or Parity error
*/
if (txcp->status == LANCER_TX_COMP_LSO_ERR ||
txcp->status == LANCER_TX_COMP_PARITY_ERR ||
txcp->status == LANCER_TX_COMP_SGE_ERR)
be_set_error(adapter, BE_ERROR_TX);
} else {
be_update_tx_err(txo, txcp->status);
}
}

if (be_check_error(adapter, BE_ERROR_TX))
return NULL;

compl->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0;
queue_tail_inc(tx_cq);
return txcp;
Expand Down Expand Up @@ -2742,7 +2801,7 @@ static void be_tx_compl_clean(struct be_adapter *adapter)
cmpl = 0;
num_wrbs = 0;
txq = &txo->q;
while ((txcp = be_tx_compl_get(txo))) {
while ((txcp = be_tx_compl_get(adapter, txo))) {
num_wrbs +=
be_tx_compl_process(adapter, txo,
txcp->end_index);
Expand Down Expand Up @@ -3121,59 +3180,16 @@ static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi,
return work_done;
}

static inline void be_update_tx_err(struct be_tx_obj *txo, u8 status)
{
switch (status) {
case BE_TX_COMP_HDR_PARSE_ERR:
tx_stats(txo)->tx_hdr_parse_err++;
break;
case BE_TX_COMP_NDMA_ERR:
tx_stats(txo)->tx_dma_err++;
break;
case BE_TX_COMP_ACL_ERR:
tx_stats(txo)->tx_spoof_check_err++;
break;
}
}

static inline void lancer_update_tx_err(struct be_tx_obj *txo, u8 status)
{
switch (status) {
case LANCER_TX_COMP_LSO_ERR:
tx_stats(txo)->tx_tso_err++;
break;
case LANCER_TX_COMP_HSW_DROP_MAC_ERR:
case LANCER_TX_COMP_HSW_DROP_VLAN_ERR:
tx_stats(txo)->tx_spoof_check_err++;
break;
case LANCER_TX_COMP_QINQ_ERR:
tx_stats(txo)->tx_qinq_err++;
break;
case LANCER_TX_COMP_PARITY_ERR:
tx_stats(txo)->tx_internal_parity_err++;
break;
case LANCER_TX_COMP_DMA_ERR:
tx_stats(txo)->tx_dma_err++;
break;
}
}

static void be_process_tx(struct be_adapter *adapter, struct be_tx_obj *txo,
int idx)
{
int num_wrbs = 0, work_done = 0;
struct be_tx_compl_info *txcp;

while ((txcp = be_tx_compl_get(txo))) {
while ((txcp = be_tx_compl_get(adapter, txo))) {
num_wrbs += be_tx_compl_process(adapter, txo, txcp->end_index);
work_done++;

if (txcp->status) {
if (lancer_chip(adapter))
lancer_update_tx_err(txo, txcp->status);
else
be_update_tx_err(txo, txcp->status);
}
}

if (work_done) {
Expand Down Expand Up @@ -5108,9 +5124,12 @@ static netdev_features_t be_features_check(struct sk_buff *skb,
features &= ~NETIF_F_TSO6;

/* Lancer cannot handle the packet with MSS less than 256.
* Also it can't handle a TSO packet with a single segment
* Disable the GSO support in such cases
*/
if (lancer_chip(adapter) && skb_shinfo(skb)->gso_size < 256)
if (lancer_chip(adapter) &&
(skb_shinfo(skb)->gso_size < 256 ||
skb_shinfo(skb)->gso_segs == 1))
features &= ~NETIF_F_GSO_MASK;
}

Expand Down