Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6
This commit is contained in:
commit
9836f4080f
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2005-2009 Solarflare Communications Inc.
|
* Copyright 2005-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -28,7 +28,8 @@ struct efx_ethtool_stat {
|
||||||
enum {
|
enum {
|
||||||
EFX_ETHTOOL_STAT_SOURCE_mac_stats,
|
EFX_ETHTOOL_STAT_SOURCE_mac_stats,
|
||||||
EFX_ETHTOOL_STAT_SOURCE_nic,
|
EFX_ETHTOOL_STAT_SOURCE_nic,
|
||||||
EFX_ETHTOOL_STAT_SOURCE_channel
|
EFX_ETHTOOL_STAT_SOURCE_channel,
|
||||||
|
EFX_ETHTOOL_STAT_SOURCE_tx_queue
|
||||||
} source;
|
} source;
|
||||||
unsigned offset;
|
unsigned offset;
|
||||||
u64(*get_stat) (void *field); /* Reader function */
|
u64(*get_stat) (void *field); /* Reader function */
|
||||||
|
@ -86,6 +87,10 @@ static u64 efx_get_atomic_stat(void *field)
|
||||||
EFX_ETHTOOL_STAT(field, channel, n_##field, \
|
EFX_ETHTOOL_STAT(field, channel, n_##field, \
|
||||||
unsigned int, efx_get_uint_stat)
|
unsigned int, efx_get_uint_stat)
|
||||||
|
|
||||||
|
#define EFX_ETHTOOL_UINT_TXQ_STAT(field) \
|
||||||
|
EFX_ETHTOOL_STAT(tx_##field, tx_queue, field, \
|
||||||
|
unsigned int, efx_get_uint_stat)
|
||||||
|
|
||||||
static struct efx_ethtool_stat efx_ethtool_stats[] = {
|
static struct efx_ethtool_stat efx_ethtool_stats[] = {
|
||||||
EFX_ETHTOOL_U64_MAC_STAT(tx_bytes),
|
EFX_ETHTOOL_U64_MAC_STAT(tx_bytes),
|
||||||
EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes),
|
EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes),
|
||||||
|
@ -116,6 +121,10 @@ static struct efx_ethtool_stat efx_ethtool_stats[] = {
|
||||||
EFX_ETHTOOL_ULONG_MAC_STAT(tx_non_tcpudp),
|
EFX_ETHTOOL_ULONG_MAC_STAT(tx_non_tcpudp),
|
||||||
EFX_ETHTOOL_ULONG_MAC_STAT(tx_mac_src_error),
|
EFX_ETHTOOL_ULONG_MAC_STAT(tx_mac_src_error),
|
||||||
EFX_ETHTOOL_ULONG_MAC_STAT(tx_ip_src_error),
|
EFX_ETHTOOL_ULONG_MAC_STAT(tx_ip_src_error),
|
||||||
|
EFX_ETHTOOL_UINT_TXQ_STAT(tso_bursts),
|
||||||
|
EFX_ETHTOOL_UINT_TXQ_STAT(tso_long_headers),
|
||||||
|
EFX_ETHTOOL_UINT_TXQ_STAT(tso_packets),
|
||||||
|
EFX_ETHTOOL_UINT_TXQ_STAT(pushes),
|
||||||
EFX_ETHTOOL_U64_MAC_STAT(rx_bytes),
|
EFX_ETHTOOL_U64_MAC_STAT(rx_bytes),
|
||||||
EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes),
|
EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes),
|
||||||
EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes),
|
EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes),
|
||||||
|
@ -237,8 +246,8 @@ static void efx_ethtool_get_drvinfo(struct net_device *net_dev,
|
||||||
strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
|
strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
|
||||||
strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version));
|
strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version));
|
||||||
if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0)
|
if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0)
|
||||||
siena_print_fwver(efx, info->fw_version,
|
efx_mcdi_print_fwver(efx, info->fw_version,
|
||||||
sizeof(info->fw_version));
|
sizeof(info->fw_version));
|
||||||
strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info));
|
strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,6 +479,7 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
|
||||||
struct efx_mac_stats *mac_stats = &efx->mac_stats;
|
struct efx_mac_stats *mac_stats = &efx->mac_stats;
|
||||||
struct efx_ethtool_stat *stat;
|
struct efx_ethtool_stat *stat;
|
||||||
struct efx_channel *channel;
|
struct efx_channel *channel;
|
||||||
|
struct efx_tx_queue *tx_queue;
|
||||||
struct rtnl_link_stats64 temp;
|
struct rtnl_link_stats64 temp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -495,6 +505,15 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
|
||||||
data[i] += stat->get_stat((void *)channel +
|
data[i] += stat->get_stat((void *)channel +
|
||||||
stat->offset);
|
stat->offset);
|
||||||
break;
|
break;
|
||||||
|
case EFX_ETHTOOL_STAT_SOURCE_tx_queue:
|
||||||
|
data[i] = 0;
|
||||||
|
efx_for_each_channel(channel, efx) {
|
||||||
|
efx_for_each_channel_tx_queue(tx_queue, channel)
|
||||||
|
data[i] +=
|
||||||
|
stat->get_stat((void *)tx_queue
|
||||||
|
+ stat->offset);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -1478,36 +1478,26 @@ static void falcon_init_rx_cfg(struct efx_nic *efx)
|
||||||
/* RX control FIFO thresholds (32 entries) */
|
/* RX control FIFO thresholds (32 entries) */
|
||||||
const unsigned ctrl_xon_thr = 20;
|
const unsigned ctrl_xon_thr = 20;
|
||||||
const unsigned ctrl_xoff_thr = 25;
|
const unsigned ctrl_xoff_thr = 25;
|
||||||
/* RX data FIFO thresholds (256-byte units; size varies) */
|
|
||||||
int data_xon_thr = efx_nic_rx_xon_thresh >> 8;
|
|
||||||
int data_xoff_thr = efx_nic_rx_xoff_thresh >> 8;
|
|
||||||
efx_oword_t reg;
|
efx_oword_t reg;
|
||||||
|
|
||||||
efx_reado(efx, ®, FR_AZ_RX_CFG);
|
efx_reado(efx, ®, FR_AZ_RX_CFG);
|
||||||
if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) {
|
if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) {
|
||||||
/* Data FIFO size is 5.5K */
|
/* Data FIFO size is 5.5K */
|
||||||
if (data_xon_thr < 0)
|
|
||||||
data_xon_thr = 512 >> 8;
|
|
||||||
if (data_xoff_thr < 0)
|
|
||||||
data_xoff_thr = 2048 >> 8;
|
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_DESC_PUSH_EN, 0);
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_DESC_PUSH_EN, 0);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_USR_BUF_SIZE,
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_USR_BUF_SIZE,
|
||||||
huge_buf_size);
|
huge_buf_size);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XON_MAC_TH, data_xon_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XON_MAC_TH, 512 >> 8);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XOFF_MAC_TH, data_xoff_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XOFF_MAC_TH, 2048 >> 8);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XON_TX_TH, ctrl_xon_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XON_TX_TH, ctrl_xon_thr);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XOFF_TX_TH, ctrl_xoff_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_AA_RX_XOFF_TX_TH, ctrl_xoff_thr);
|
||||||
} else {
|
} else {
|
||||||
/* Data FIFO size is 80K; register fields moved */
|
/* Data FIFO size is 80K; register fields moved */
|
||||||
if (data_xon_thr < 0)
|
|
||||||
data_xon_thr = 27648 >> 8; /* ~3*max MTU */
|
|
||||||
if (data_xoff_thr < 0)
|
|
||||||
data_xoff_thr = 54272 >> 8; /* ~80Kb - 3*max MTU */
|
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_DESC_PUSH_EN, 0);
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_DESC_PUSH_EN, 0);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_USR_BUF_SIZE,
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_USR_BUF_SIZE,
|
||||||
huge_buf_size);
|
huge_buf_size);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XON_MAC_TH, data_xon_thr);
|
/* Send XON and XOFF at ~3 * max MTU away from empty/full */
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XOFF_MAC_TH, data_xoff_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XON_MAC_TH, 27648 >> 8);
|
||||||
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XOFF_MAC_TH, 54272 >> 8);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XON_TX_TH, ctrl_xon_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XON_TX_TH, ctrl_xon_thr);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XOFF_TX_TH, ctrl_xoff_thr);
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_XOFF_TX_TH, ctrl_xoff_thr);
|
||||||
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_INGR_EN, 1);
|
EFX_SET_OWORD_FIELD(reg, FRF_BZ_RX_INGR_EN, 1);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2007-2009 Solarflare Communications Inc.
|
* Copyright 2007-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2008-2009 Solarflare Communications Inc.
|
* Copyright 2008-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -602,7 +602,7 @@ void efx_mcdi_process_event(struct efx_channel *channel,
|
||||||
**************************************************************************
|
**************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int efx_mcdi_fwver(struct efx_nic *efx, u64 *version, u32 *build)
|
void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len)
|
||||||
{
|
{
|
||||||
u8 outbuf[ALIGN(MC_CMD_GET_VERSION_V1_OUT_LEN, 4)];
|
u8 outbuf[ALIGN(MC_CMD_GET_VERSION_V1_OUT_LEN, 4)];
|
||||||
size_t outlength;
|
size_t outlength;
|
||||||
|
@ -616,29 +616,20 @@ int efx_mcdi_fwver(struct efx_nic *efx, u64 *version, u32 *build)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (outlength == MC_CMD_GET_VERSION_V0_OUT_LEN) {
|
|
||||||
*version = 0;
|
|
||||||
*build = MCDI_DWORD(outbuf, GET_VERSION_OUT_FIRMWARE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outlength < MC_CMD_GET_VERSION_V1_OUT_LEN) {
|
if (outlength < MC_CMD_GET_VERSION_V1_OUT_LEN) {
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
ver_words = (__le16 *)MCDI_PTR(outbuf, GET_VERSION_OUT_VERSION);
|
ver_words = (__le16 *)MCDI_PTR(outbuf, GET_VERSION_OUT_VERSION);
|
||||||
*version = (((u64)le16_to_cpu(ver_words[0]) << 48) |
|
snprintf(buf, len, "%u.%u.%u.%u",
|
||||||
((u64)le16_to_cpu(ver_words[1]) << 32) |
|
le16_to_cpu(ver_words[0]), le16_to_cpu(ver_words[1]),
|
||||||
((u64)le16_to_cpu(ver_words[2]) << 16) |
|
le16_to_cpu(ver_words[2]), le16_to_cpu(ver_words[3]));
|
||||||
le16_to_cpu(ver_words[3]));
|
return;
|
||||||
*build = MCDI_DWORD(outbuf, GET_VERSION_OUT_FIRMWARE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
netif_err(efx, probe, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
|
netif_err(efx, probe, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
|
||||||
return rc;
|
buf[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
|
int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2008-2009 Solarflare Communications Inc.
|
* Copyright 2008-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -93,7 +93,7 @@ extern void efx_mcdi_process_event(struct efx_channel *channel,
|
||||||
#define MCDI_EVENT_FIELD(_ev, _field) \
|
#define MCDI_EVENT_FIELD(_ev, _field) \
|
||||||
EFX_QWORD_FIELD(_ev, MCDI_EVENT_ ## _field)
|
EFX_QWORD_FIELD(_ev, MCDI_EVENT_ ## _field)
|
||||||
|
|
||||||
extern int efx_mcdi_fwver(struct efx_nic *efx, u64 *version, u32 *build);
|
extern void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len);
|
||||||
extern int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
|
extern int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
|
||||||
bool *was_attached_out);
|
bool *was_attached_out);
|
||||||
extern int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
|
extern int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2009 Solarflare Communications Inc.
|
* Copyright 2009-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2009 Solarflare Communications Inc.
|
* Copyright 2009-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2009 Solarflare Communications Inc.
|
* Copyright 2009-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -51,13 +51,10 @@ int efx_mdio_reset_mmd(struct efx_nic *port, int mmd,
|
||||||
return spins ? spins : -ETIMEDOUT;
|
return spins ? spins : -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd, int fault_fatal)
|
static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (LOOPBACK_INTERNAL(efx))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (mmd != MDIO_MMD_AN) {
|
if (mmd != MDIO_MMD_AN) {
|
||||||
/* Read MMD STATUS2 to check it is responding. */
|
/* Read MMD STATUS2 to check it is responding. */
|
||||||
status = efx_mdio_read(efx, mmd, MDIO_STAT2);
|
status = efx_mdio_read(efx, mmd, MDIO_STAT2);
|
||||||
|
@ -68,20 +65,6 @@ static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd, int fault_fatal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read MMD STATUS 1 to check for fault. */
|
|
||||||
status = efx_mdio_read(efx, mmd, MDIO_STAT1);
|
|
||||||
if (status & MDIO_STAT1_FAULT) {
|
|
||||||
if (fault_fatal) {
|
|
||||||
netif_err(efx, hw, efx->net_dev,
|
|
||||||
"PHY MMD %d reporting fatal"
|
|
||||||
" fault: status %x\n", mmd, status);
|
|
||||||
return -EIO;
|
|
||||||
} else {
|
|
||||||
netif_dbg(efx, hw, efx->net_dev,
|
|
||||||
"PHY MMD %d reporting status"
|
|
||||||
" %x (expected)\n", mmd, status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,8 +113,7 @@ int efx_mdio_wait_reset_mmds(struct efx_nic *efx, unsigned int mmd_mask)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int efx_mdio_check_mmds(struct efx_nic *efx,
|
int efx_mdio_check_mmds(struct efx_nic *efx, unsigned int mmd_mask)
|
||||||
unsigned int mmd_mask, unsigned int fatal_mask)
|
|
||||||
{
|
{
|
||||||
int mmd = 0, probe_mmd, devs1, devs2;
|
int mmd = 0, probe_mmd, devs1, devs2;
|
||||||
u32 devices;
|
u32 devices;
|
||||||
|
@ -161,13 +143,9 @@ int efx_mdio_check_mmds(struct efx_nic *efx,
|
||||||
|
|
||||||
/* Check all required MMDs are responding and happy. */
|
/* Check all required MMDs are responding and happy. */
|
||||||
while (mmd_mask) {
|
while (mmd_mask) {
|
||||||
if (mmd_mask & 1) {
|
if ((mmd_mask & 1) && efx_mdio_check_mmd(efx, mmd))
|
||||||
int fault_fatal = fatal_mask & 1;
|
return -EIO;
|
||||||
if (efx_mdio_check_mmd(efx, mmd, fault_fatal))
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
mmd_mask = mmd_mask >> 1;
|
mmd_mask = mmd_mask >> 1;
|
||||||
fatal_mask = fatal_mask >> 1;
|
|
||||||
mmd++;
|
mmd++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +315,7 @@ int efx_mdio_test_alive(struct efx_nic *efx)
|
||||||
"no MDIO PHY present with ID %d\n", efx->mdio.prtad);
|
"no MDIO PHY present with ID %d\n", efx->mdio.prtad);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
} else {
|
} else {
|
||||||
rc = efx_mdio_check_mmds(efx, efx->mdio.mmds, 0);
|
rc = efx_mdio_check_mmds(efx, efx->mdio.mmds);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&efx->mac_lock);
|
mutex_unlock(&efx->mac_lock);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -68,8 +68,7 @@ extern int efx_mdio_reset_mmd(struct efx_nic *efx, int mmd,
|
||||||
int spins, int spintime);
|
int spins, int spintime);
|
||||||
|
|
||||||
/* As efx_mdio_check_mmd but for multiple MMDs */
|
/* As efx_mdio_check_mmd but for multiple MMDs */
|
||||||
int efx_mdio_check_mmds(struct efx_nic *efx,
|
int efx_mdio_check_mmds(struct efx_nic *efx, unsigned int mmd_mask);
|
||||||
unsigned int mmd_mask, unsigned int fatal_mask);
|
|
||||||
|
|
||||||
/* Check the link status of specified mmds in bit mask */
|
/* Check the link status of specified mmds in bit mask */
|
||||||
extern bool efx_mdio_links_ok(struct efx_nic *efx, unsigned int mmd_mask);
|
extern bool efx_mdio_links_ok(struct efx_nic *efx, unsigned int mmd_mask);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2005-2009 Solarflare Communications Inc.
|
* Copyright 2005-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#define EFX_DRIVER_VERSION "3.0"
|
#define EFX_DRIVER_VERSION "3.1"
|
||||||
|
|
||||||
#ifdef EFX_ENABLE_DEBUG
|
#ifdef EFX_ENABLE_DEBUG
|
||||||
#define EFX_BUG_ON_PARANOID(x) BUG_ON(x)
|
#define EFX_BUG_ON_PARANOID(x) BUG_ON(x)
|
||||||
|
@ -214,15 +214,17 @@ struct efx_tx_queue {
|
||||||
* If both this and page are %NULL, the buffer slot is currently free.
|
* If both this and page are %NULL, the buffer slot is currently free.
|
||||||
* @page: The associated page buffer, if any.
|
* @page: The associated page buffer, if any.
|
||||||
* If both this and skb are %NULL, the buffer slot is currently free.
|
* If both this and skb are %NULL, the buffer slot is currently free.
|
||||||
* @data: Pointer to ethernet header
|
|
||||||
* @len: Buffer length, in bytes.
|
* @len: Buffer length, in bytes.
|
||||||
|
* @is_page: Indicates if @page is valid. If false, @skb is valid.
|
||||||
*/
|
*/
|
||||||
struct efx_rx_buffer {
|
struct efx_rx_buffer {
|
||||||
dma_addr_t dma_addr;
|
dma_addr_t dma_addr;
|
||||||
struct sk_buff *skb;
|
union {
|
||||||
struct page *page;
|
struct sk_buff *skb;
|
||||||
char *data;
|
struct page *page;
|
||||||
|
} u;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
|
bool is_page;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -41,26 +41,6 @@
|
||||||
#define RX_DC_ENTRIES 64
|
#define RX_DC_ENTRIES 64
|
||||||
#define RX_DC_ENTRIES_ORDER 3
|
#define RX_DC_ENTRIES_ORDER 3
|
||||||
|
|
||||||
/* RX FIFO XOFF watermark
|
|
||||||
*
|
|
||||||
* When the amount of the RX FIFO increases used increases past this
|
|
||||||
* watermark send XOFF. Only used if RX flow control is enabled (ethtool -A)
|
|
||||||
* This also has an effect on RX/TX arbitration
|
|
||||||
*/
|
|
||||||
int efx_nic_rx_xoff_thresh = -1;
|
|
||||||
module_param_named(rx_xoff_thresh_bytes, efx_nic_rx_xoff_thresh, int, 0644);
|
|
||||||
MODULE_PARM_DESC(rx_xoff_thresh_bytes, "RX fifo XOFF threshold");
|
|
||||||
|
|
||||||
/* RX FIFO XON watermark
|
|
||||||
*
|
|
||||||
* When the amount of the RX FIFO used decreases below this
|
|
||||||
* watermark send XON. Only used if TX flow control is enabled (ethtool -A)
|
|
||||||
* This also has an effect on RX/TX arbitration
|
|
||||||
*/
|
|
||||||
int efx_nic_rx_xon_thresh = -1;
|
|
||||||
module_param_named(rx_xon_thresh_bytes, efx_nic_rx_xon_thresh, int, 0644);
|
|
||||||
MODULE_PARM_DESC(rx_xon_thresh_bytes, "RX fifo XON threshold");
|
|
||||||
|
|
||||||
/* If EFX_MAX_INT_ERRORS internal errors occur within
|
/* If EFX_MAX_INT_ERRORS internal errors occur within
|
||||||
* EFX_INT_ERROR_EXPIRE seconds, we consider the NIC broken and
|
* EFX_INT_ERROR_EXPIRE seconds, we consider the NIC broken and
|
||||||
* disable it.
|
* disable it.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -142,20 +142,14 @@ static inline struct falcon_board *falcon_board(struct efx_nic *efx)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct siena_nic_data - Siena NIC state
|
* struct siena_nic_data - Siena NIC state
|
||||||
* @fw_version: Management controller firmware version
|
|
||||||
* @fw_build: Firmware build number
|
|
||||||
* @mcdi: Management-Controller-to-Driver Interface
|
* @mcdi: Management-Controller-to-Driver Interface
|
||||||
* @wol_filter_id: Wake-on-LAN packet filter id
|
* @wol_filter_id: Wake-on-LAN packet filter id
|
||||||
*/
|
*/
|
||||||
struct siena_nic_data {
|
struct siena_nic_data {
|
||||||
u64 fw_version;
|
|
||||||
u32 fw_build;
|
|
||||||
struct efx_mcdi_iface mcdi;
|
struct efx_mcdi_iface mcdi;
|
||||||
int wol_filter_id;
|
int wol_filter_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void siena_print_fwver(struct efx_nic *efx, char *buf, size_t len);
|
|
||||||
|
|
||||||
extern struct efx_nic_type falcon_a1_nic_type;
|
extern struct efx_nic_type falcon_a1_nic_type;
|
||||||
extern struct efx_nic_type falcon_b0_nic_type;
|
extern struct efx_nic_type falcon_b0_nic_type;
|
||||||
extern struct efx_nic_type siena_a0_nic_type;
|
extern struct efx_nic_type siena_a0_nic_type;
|
||||||
|
@ -194,7 +188,6 @@ extern void efx_nic_eventq_read_ack(struct efx_channel *channel);
|
||||||
/* MAC/PHY */
|
/* MAC/PHY */
|
||||||
extern void falcon_drain_tx_fifo(struct efx_nic *efx);
|
extern void falcon_drain_tx_fifo(struct efx_nic *efx);
|
||||||
extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
|
extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
|
||||||
extern int efx_nic_rx_xoff_thresh, efx_nic_rx_xon_thresh;
|
|
||||||
|
|
||||||
/* Interrupts and test events */
|
/* Interrupts and test events */
|
||||||
extern int efx_nic_init_interrupt(struct efx_nic *efx);
|
extern int efx_nic_init_interrupt(struct efx_nic *efx);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2007-2009 Solarflare Communications Inc.
|
* Copyright 2007-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2005-2009 Solarflare Communications Inc.
|
* Copyright 2005-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -89,24 +89,37 @@ static unsigned int rx_refill_limit = 95;
|
||||||
*/
|
*/
|
||||||
#define EFX_RXD_HEAD_ROOM 2
|
#define EFX_RXD_HEAD_ROOM 2
|
||||||
|
|
||||||
static inline unsigned int efx_rx_buf_offset(struct efx_rx_buffer *buf)
|
/* Offset of ethernet header within page */
|
||||||
|
static inline unsigned int efx_rx_buf_offset(struct efx_nic *efx,
|
||||||
|
struct efx_rx_buffer *buf)
|
||||||
{
|
{
|
||||||
/* Offset is always within one page, so we don't need to consider
|
/* Offset is always within one page, so we don't need to consider
|
||||||
* the page order.
|
* the page order.
|
||||||
*/
|
*/
|
||||||
return (__force unsigned long) buf->data & (PAGE_SIZE - 1);
|
return (((__force unsigned long) buf->dma_addr & (PAGE_SIZE - 1)) +
|
||||||
|
efx->type->rx_buffer_hash_size);
|
||||||
}
|
}
|
||||||
static inline unsigned int efx_rx_buf_size(struct efx_nic *efx)
|
static inline unsigned int efx_rx_buf_size(struct efx_nic *efx)
|
||||||
{
|
{
|
||||||
return PAGE_SIZE << efx->rx_buffer_order;
|
return PAGE_SIZE << efx->rx_buffer_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 efx_rx_buf_hash(struct efx_rx_buffer *buf)
|
static u8 *efx_rx_buf_eh(struct efx_nic *efx, struct efx_rx_buffer *buf)
|
||||||
{
|
{
|
||||||
|
if (buf->is_page)
|
||||||
|
return page_address(buf->u.page) + efx_rx_buf_offset(efx, buf);
|
||||||
|
else
|
||||||
|
return ((u8 *)buf->u.skb->data +
|
||||||
|
efx->type->rx_buffer_hash_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 efx_rx_buf_hash(const u8 *eh)
|
||||||
|
{
|
||||||
|
/* The ethernet header is always directly after any hash. */
|
||||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) || NET_IP_ALIGN % 4 == 0
|
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) || NET_IP_ALIGN % 4 == 0
|
||||||
return __le32_to_cpup((const __le32 *)(buf->data - 4));
|
return __le32_to_cpup((const __le32 *)(eh - 4));
|
||||||
#else
|
#else
|
||||||
const u8 *data = (const u8 *)(buf->data - 4);
|
const u8 *data = eh - 4;
|
||||||
return ((u32)data[0] |
|
return ((u32)data[0] |
|
||||||
(u32)data[1] << 8 |
|
(u32)data[1] << 8 |
|
||||||
(u32)data[2] << 16 |
|
(u32)data[2] << 16 |
|
||||||
|
@ -129,6 +142,7 @@ static int efx_init_rx_buffers_skb(struct efx_rx_queue *rx_queue)
|
||||||
struct efx_nic *efx = rx_queue->efx;
|
struct efx_nic *efx = rx_queue->efx;
|
||||||
struct net_device *net_dev = efx->net_dev;
|
struct net_device *net_dev = efx->net_dev;
|
||||||
struct efx_rx_buffer *rx_buf;
|
struct efx_rx_buffer *rx_buf;
|
||||||
|
struct sk_buff *skb;
|
||||||
int skb_len = efx->rx_buffer_len;
|
int skb_len = efx->rx_buffer_len;
|
||||||
unsigned index, count;
|
unsigned index, count;
|
||||||
|
|
||||||
|
@ -136,24 +150,23 @@ static int efx_init_rx_buffers_skb(struct efx_rx_queue *rx_queue)
|
||||||
index = rx_queue->added_count & rx_queue->ptr_mask;
|
index = rx_queue->added_count & rx_queue->ptr_mask;
|
||||||
rx_buf = efx_rx_buffer(rx_queue, index);
|
rx_buf = efx_rx_buffer(rx_queue, index);
|
||||||
|
|
||||||
rx_buf->skb = netdev_alloc_skb(net_dev, skb_len);
|
rx_buf->u.skb = skb = netdev_alloc_skb(net_dev, skb_len);
|
||||||
if (unlikely(!rx_buf->skb))
|
if (unlikely(!skb))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
rx_buf->page = NULL;
|
|
||||||
|
|
||||||
/* Adjust the SKB for padding and checksum */
|
/* Adjust the SKB for padding and checksum */
|
||||||
skb_reserve(rx_buf->skb, NET_IP_ALIGN);
|
skb_reserve(skb, NET_IP_ALIGN);
|
||||||
rx_buf->len = skb_len - NET_IP_ALIGN;
|
rx_buf->len = skb_len - NET_IP_ALIGN;
|
||||||
rx_buf->data = (char *)rx_buf->skb->data;
|
rx_buf->is_page = false;
|
||||||
rx_buf->skb->ip_summed = CHECKSUM_UNNECESSARY;
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
|
|
||||||
rx_buf->dma_addr = pci_map_single(efx->pci_dev,
|
rx_buf->dma_addr = pci_map_single(efx->pci_dev,
|
||||||
rx_buf->data, rx_buf->len,
|
skb->data, rx_buf->len,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
if (unlikely(pci_dma_mapping_error(efx->pci_dev,
|
if (unlikely(pci_dma_mapping_error(efx->pci_dev,
|
||||||
rx_buf->dma_addr))) {
|
rx_buf->dma_addr))) {
|
||||||
dev_kfree_skb_any(rx_buf->skb);
|
dev_kfree_skb_any(skb);
|
||||||
rx_buf->skb = NULL;
|
rx_buf->u.skb = NULL;
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,10 +224,9 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue)
|
||||||
index = rx_queue->added_count & rx_queue->ptr_mask;
|
index = rx_queue->added_count & rx_queue->ptr_mask;
|
||||||
rx_buf = efx_rx_buffer(rx_queue, index);
|
rx_buf = efx_rx_buffer(rx_queue, index);
|
||||||
rx_buf->dma_addr = dma_addr + EFX_PAGE_IP_ALIGN;
|
rx_buf->dma_addr = dma_addr + EFX_PAGE_IP_ALIGN;
|
||||||
rx_buf->skb = NULL;
|
rx_buf->u.page = page;
|
||||||
rx_buf->page = page;
|
|
||||||
rx_buf->data = page_addr + EFX_PAGE_IP_ALIGN;
|
|
||||||
rx_buf->len = efx->rx_buffer_len - EFX_PAGE_IP_ALIGN;
|
rx_buf->len = efx->rx_buffer_len - EFX_PAGE_IP_ALIGN;
|
||||||
|
rx_buf->is_page = true;
|
||||||
++rx_queue->added_count;
|
++rx_queue->added_count;
|
||||||
++rx_queue->alloc_page_count;
|
++rx_queue->alloc_page_count;
|
||||||
++state->refcnt;
|
++state->refcnt;
|
||||||
|
@ -235,19 +247,17 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue)
|
||||||
static void efx_unmap_rx_buffer(struct efx_nic *efx,
|
static void efx_unmap_rx_buffer(struct efx_nic *efx,
|
||||||
struct efx_rx_buffer *rx_buf)
|
struct efx_rx_buffer *rx_buf)
|
||||||
{
|
{
|
||||||
if (rx_buf->page) {
|
if (rx_buf->is_page && rx_buf->u.page) {
|
||||||
struct efx_rx_page_state *state;
|
struct efx_rx_page_state *state;
|
||||||
|
|
||||||
EFX_BUG_ON_PARANOID(rx_buf->skb);
|
state = page_address(rx_buf->u.page);
|
||||||
|
|
||||||
state = page_address(rx_buf->page);
|
|
||||||
if (--state->refcnt == 0) {
|
if (--state->refcnt == 0) {
|
||||||
pci_unmap_page(efx->pci_dev,
|
pci_unmap_page(efx->pci_dev,
|
||||||
state->dma_addr,
|
state->dma_addr,
|
||||||
efx_rx_buf_size(efx),
|
efx_rx_buf_size(efx),
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
}
|
}
|
||||||
} else if (likely(rx_buf->skb)) {
|
} else if (!rx_buf->is_page && rx_buf->u.skb) {
|
||||||
pci_unmap_single(efx->pci_dev, rx_buf->dma_addr,
|
pci_unmap_single(efx->pci_dev, rx_buf->dma_addr,
|
||||||
rx_buf->len, PCI_DMA_FROMDEVICE);
|
rx_buf->len, PCI_DMA_FROMDEVICE);
|
||||||
}
|
}
|
||||||
|
@ -256,12 +266,12 @@ static void efx_unmap_rx_buffer(struct efx_nic *efx,
|
||||||
static void efx_free_rx_buffer(struct efx_nic *efx,
|
static void efx_free_rx_buffer(struct efx_nic *efx,
|
||||||
struct efx_rx_buffer *rx_buf)
|
struct efx_rx_buffer *rx_buf)
|
||||||
{
|
{
|
||||||
if (rx_buf->page) {
|
if (rx_buf->is_page && rx_buf->u.page) {
|
||||||
__free_pages(rx_buf->page, efx->rx_buffer_order);
|
__free_pages(rx_buf->u.page, efx->rx_buffer_order);
|
||||||
rx_buf->page = NULL;
|
rx_buf->u.page = NULL;
|
||||||
} else if (likely(rx_buf->skb)) {
|
} else if (!rx_buf->is_page && rx_buf->u.skb) {
|
||||||
dev_kfree_skb_any(rx_buf->skb);
|
dev_kfree_skb_any(rx_buf->u.skb);
|
||||||
rx_buf->skb = NULL;
|
rx_buf->u.skb = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +287,7 @@ static void efx_fini_rx_buffer(struct efx_rx_queue *rx_queue,
|
||||||
static void efx_resurrect_rx_buffer(struct efx_rx_queue *rx_queue,
|
static void efx_resurrect_rx_buffer(struct efx_rx_queue *rx_queue,
|
||||||
struct efx_rx_buffer *rx_buf)
|
struct efx_rx_buffer *rx_buf)
|
||||||
{
|
{
|
||||||
struct efx_rx_page_state *state = page_address(rx_buf->page);
|
struct efx_rx_page_state *state = page_address(rx_buf->u.page);
|
||||||
struct efx_rx_buffer *new_buf;
|
struct efx_rx_buffer *new_buf;
|
||||||
unsigned fill_level, index;
|
unsigned fill_level, index;
|
||||||
|
|
||||||
|
@ -292,16 +302,14 @@ static void efx_resurrect_rx_buffer(struct efx_rx_queue *rx_queue,
|
||||||
}
|
}
|
||||||
|
|
||||||
++state->refcnt;
|
++state->refcnt;
|
||||||
get_page(rx_buf->page);
|
get_page(rx_buf->u.page);
|
||||||
|
|
||||||
index = rx_queue->added_count & rx_queue->ptr_mask;
|
index = rx_queue->added_count & rx_queue->ptr_mask;
|
||||||
new_buf = efx_rx_buffer(rx_queue, index);
|
new_buf = efx_rx_buffer(rx_queue, index);
|
||||||
new_buf->dma_addr = rx_buf->dma_addr ^ (PAGE_SIZE >> 1);
|
new_buf->dma_addr = rx_buf->dma_addr ^ (PAGE_SIZE >> 1);
|
||||||
new_buf->skb = NULL;
|
new_buf->u.page = rx_buf->u.page;
|
||||||
new_buf->page = rx_buf->page;
|
|
||||||
new_buf->data = (void *)
|
|
||||||
((__force unsigned long)rx_buf->data ^ (PAGE_SIZE >> 1));
|
|
||||||
new_buf->len = rx_buf->len;
|
new_buf->len = rx_buf->len;
|
||||||
|
new_buf->is_page = true;
|
||||||
++rx_queue->added_count;
|
++rx_queue->added_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,16 +323,15 @@ static void efx_recycle_rx_buffer(struct efx_channel *channel,
|
||||||
struct efx_rx_buffer *new_buf;
|
struct efx_rx_buffer *new_buf;
|
||||||
unsigned index;
|
unsigned index;
|
||||||
|
|
||||||
if (rx_buf->page != NULL && efx->rx_buffer_len <= EFX_RX_HALF_PAGE &&
|
if (rx_buf->is_page && efx->rx_buffer_len <= EFX_RX_HALF_PAGE &&
|
||||||
page_count(rx_buf->page) == 1)
|
page_count(rx_buf->u.page) == 1)
|
||||||
efx_resurrect_rx_buffer(rx_queue, rx_buf);
|
efx_resurrect_rx_buffer(rx_queue, rx_buf);
|
||||||
|
|
||||||
index = rx_queue->added_count & rx_queue->ptr_mask;
|
index = rx_queue->added_count & rx_queue->ptr_mask;
|
||||||
new_buf = efx_rx_buffer(rx_queue, index);
|
new_buf = efx_rx_buffer(rx_queue, index);
|
||||||
|
|
||||||
memcpy(new_buf, rx_buf, sizeof(*new_buf));
|
memcpy(new_buf, rx_buf, sizeof(*new_buf));
|
||||||
rx_buf->page = NULL;
|
rx_buf->u.page = NULL;
|
||||||
rx_buf->skb = NULL;
|
|
||||||
++rx_queue->added_count;
|
++rx_queue->added_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,7 +435,7 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
|
||||||
* data at the end of the skb will be trashed. So
|
* data at the end of the skb will be trashed. So
|
||||||
* we have no choice but to leak the fragment.
|
* we have no choice but to leak the fragment.
|
||||||
*/
|
*/
|
||||||
*leak_packet = (rx_buf->skb != NULL);
|
*leak_packet = !rx_buf->is_page;
|
||||||
efx_schedule_reset(efx, RESET_TYPE_RX_RECOVERY);
|
efx_schedule_reset(efx, RESET_TYPE_RX_RECOVERY);
|
||||||
} else {
|
} else {
|
||||||
if (net_ratelimit())
|
if (net_ratelimit())
|
||||||
|
@ -448,19 +455,18 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
|
||||||
*/
|
*/
|
||||||
static void efx_rx_packet_gro(struct efx_channel *channel,
|
static void efx_rx_packet_gro(struct efx_channel *channel,
|
||||||
struct efx_rx_buffer *rx_buf,
|
struct efx_rx_buffer *rx_buf,
|
||||||
bool checksummed)
|
const u8 *eh, bool checksummed)
|
||||||
{
|
{
|
||||||
struct napi_struct *napi = &channel->napi_str;
|
struct napi_struct *napi = &channel->napi_str;
|
||||||
gro_result_t gro_result;
|
gro_result_t gro_result;
|
||||||
|
|
||||||
/* Pass the skb/page into the GRO engine */
|
/* Pass the skb/page into the GRO engine */
|
||||||
if (rx_buf->page) {
|
if (rx_buf->is_page) {
|
||||||
struct efx_nic *efx = channel->efx;
|
struct efx_nic *efx = channel->efx;
|
||||||
struct page *page = rx_buf->page;
|
struct page *page = rx_buf->u.page;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
EFX_BUG_ON_PARANOID(rx_buf->skb);
|
rx_buf->u.page = NULL;
|
||||||
rx_buf->page = NULL;
|
|
||||||
|
|
||||||
skb = napi_get_frags(napi);
|
skb = napi_get_frags(napi);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
|
@ -469,11 +475,11 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (efx->net_dev->features & NETIF_F_RXHASH)
|
if (efx->net_dev->features & NETIF_F_RXHASH)
|
||||||
skb->rxhash = efx_rx_buf_hash(rx_buf);
|
skb->rxhash = efx_rx_buf_hash(eh);
|
||||||
|
|
||||||
skb_shinfo(skb)->frags[0].page = page;
|
skb_shinfo(skb)->frags[0].page = page;
|
||||||
skb_shinfo(skb)->frags[0].page_offset =
|
skb_shinfo(skb)->frags[0].page_offset =
|
||||||
efx_rx_buf_offset(rx_buf);
|
efx_rx_buf_offset(efx, rx_buf);
|
||||||
skb_shinfo(skb)->frags[0].size = rx_buf->len;
|
skb_shinfo(skb)->frags[0].size = rx_buf->len;
|
||||||
skb_shinfo(skb)->nr_frags = 1;
|
skb_shinfo(skb)->nr_frags = 1;
|
||||||
|
|
||||||
|
@ -487,11 +493,10 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
|
||||||
|
|
||||||
gro_result = napi_gro_frags(napi);
|
gro_result = napi_gro_frags(napi);
|
||||||
} else {
|
} else {
|
||||||
struct sk_buff *skb = rx_buf->skb;
|
struct sk_buff *skb = rx_buf->u.skb;
|
||||||
|
|
||||||
EFX_BUG_ON_PARANOID(!skb);
|
|
||||||
EFX_BUG_ON_PARANOID(!checksummed);
|
EFX_BUG_ON_PARANOID(!checksummed);
|
||||||
rx_buf->skb = NULL;
|
rx_buf->u.skb = NULL;
|
||||||
|
|
||||||
gro_result = napi_gro_receive(napi, skb);
|
gro_result = napi_gro_receive(napi, skb);
|
||||||
}
|
}
|
||||||
|
@ -513,9 +518,6 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
|
||||||
bool leak_packet = false;
|
bool leak_packet = false;
|
||||||
|
|
||||||
rx_buf = efx_rx_buffer(rx_queue, index);
|
rx_buf = efx_rx_buffer(rx_queue, index);
|
||||||
EFX_BUG_ON_PARANOID(!rx_buf->data);
|
|
||||||
EFX_BUG_ON_PARANOID(rx_buf->skb && rx_buf->page);
|
|
||||||
EFX_BUG_ON_PARANOID(!(rx_buf->skb || rx_buf->page));
|
|
||||||
|
|
||||||
/* This allows the refill path to post another buffer.
|
/* This allows the refill path to post another buffer.
|
||||||
* EFX_RXD_HEAD_ROOM ensures that the slot we are using
|
* EFX_RXD_HEAD_ROOM ensures that the slot we are using
|
||||||
|
@ -554,12 +556,12 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
|
||||||
/* Prefetch nice and early so data will (hopefully) be in cache by
|
/* Prefetch nice and early so data will (hopefully) be in cache by
|
||||||
* the time we look at it.
|
* the time we look at it.
|
||||||
*/
|
*/
|
||||||
prefetch(rx_buf->data);
|
prefetch(efx_rx_buf_eh(efx, rx_buf));
|
||||||
|
|
||||||
/* Pipeline receives so that we give time for packet headers to be
|
/* Pipeline receives so that we give time for packet headers to be
|
||||||
* prefetched into cache.
|
* prefetched into cache.
|
||||||
*/
|
*/
|
||||||
rx_buf->len = len;
|
rx_buf->len = len - efx->type->rx_buffer_hash_size;
|
||||||
out:
|
out:
|
||||||
if (channel->rx_pkt)
|
if (channel->rx_pkt)
|
||||||
__efx_rx_packet(channel,
|
__efx_rx_packet(channel,
|
||||||
|
@ -574,45 +576,43 @@ void __efx_rx_packet(struct efx_channel *channel,
|
||||||
{
|
{
|
||||||
struct efx_nic *efx = channel->efx;
|
struct efx_nic *efx = channel->efx;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
u8 *eh = efx_rx_buf_eh(efx, rx_buf);
|
||||||
rx_buf->data += efx->type->rx_buffer_hash_size;
|
|
||||||
rx_buf->len -= efx->type->rx_buffer_hash_size;
|
|
||||||
|
|
||||||
/* If we're in loopback test, then pass the packet directly to the
|
/* If we're in loopback test, then pass the packet directly to the
|
||||||
* loopback layer, and free the rx_buf here
|
* loopback layer, and free the rx_buf here
|
||||||
*/
|
*/
|
||||||
if (unlikely(efx->loopback_selftest)) {
|
if (unlikely(efx->loopback_selftest)) {
|
||||||
efx_loopback_rx_packet(efx, rx_buf->data, rx_buf->len);
|
efx_loopback_rx_packet(efx, eh, rx_buf->len);
|
||||||
efx_free_rx_buffer(efx, rx_buf);
|
efx_free_rx_buffer(efx, rx_buf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rx_buf->skb) {
|
if (!rx_buf->is_page) {
|
||||||
prefetch(skb_shinfo(rx_buf->skb));
|
skb = rx_buf->u.skb;
|
||||||
|
|
||||||
skb_reserve(rx_buf->skb, efx->type->rx_buffer_hash_size);
|
prefetch(skb_shinfo(skb));
|
||||||
skb_put(rx_buf->skb, rx_buf->len);
|
|
||||||
|
skb_reserve(skb, efx->type->rx_buffer_hash_size);
|
||||||
|
skb_put(skb, rx_buf->len);
|
||||||
|
|
||||||
if (efx->net_dev->features & NETIF_F_RXHASH)
|
if (efx->net_dev->features & NETIF_F_RXHASH)
|
||||||
rx_buf->skb->rxhash = efx_rx_buf_hash(rx_buf);
|
skb->rxhash = efx_rx_buf_hash(eh);
|
||||||
|
|
||||||
/* Move past the ethernet header. rx_buf->data still points
|
/* Move past the ethernet header. rx_buf->data still points
|
||||||
* at the ethernet header */
|
* at the ethernet header */
|
||||||
rx_buf->skb->protocol = eth_type_trans(rx_buf->skb,
|
skb->protocol = eth_type_trans(skb, efx->net_dev);
|
||||||
efx->net_dev);
|
|
||||||
|
|
||||||
skb_record_rx_queue(rx_buf->skb, channel->channel);
|
skb_record_rx_queue(skb, channel->channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (likely(checksummed || rx_buf->page)) {
|
if (likely(checksummed || rx_buf->is_page)) {
|
||||||
efx_rx_packet_gro(channel, rx_buf, checksummed);
|
efx_rx_packet_gro(channel, rx_buf, eh, checksummed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We now own the SKB */
|
/* We now own the SKB */
|
||||||
skb = rx_buf->skb;
|
skb = rx_buf->u.skb;
|
||||||
rx_buf->skb = NULL;
|
rx_buf->u.skb = NULL;
|
||||||
EFX_BUG_ON_PARANOID(!skb);
|
|
||||||
|
|
||||||
/* Set the SKB flags */
|
/* Set the SKB flags */
|
||||||
skb_checksum_none_assert(skb);
|
skb_checksum_none_assert(skb);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2008 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -227,13 +227,6 @@ static int siena_probe_nic(struct efx_nic *efx)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
|
|
||||||
rc = efx_mcdi_fwver(efx, &nic_data->fw_version, &nic_data->fw_build);
|
|
||||||
if (rc) {
|
|
||||||
netif_err(efx, probe, efx->net_dev,
|
|
||||||
"Failed to read MCPU firmware version - rc %d\n", rc);
|
|
||||||
goto fail1; /* MCPU absent? */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Let the BMC know that the driver is now in charge of link and
|
/* Let the BMC know that the driver is now in charge of link and
|
||||||
* filter settings. We must do this before we reset the NIC */
|
* filter settings. We must do this before we reset the NIC */
|
||||||
rc = efx_mcdi_drv_attach(efx, true, &already_attached);
|
rc = efx_mcdi_drv_attach(efx, true, &already_attached);
|
||||||
|
@ -348,11 +341,6 @@ static int siena_init_nic(struct efx_nic *efx)
|
||||||
FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8);
|
FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8);
|
||||||
efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG3);
|
efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG3);
|
||||||
|
|
||||||
if (efx_nic_rx_xoff_thresh >= 0 || efx_nic_rx_xon_thresh >= 0)
|
|
||||||
/* No MCDI operation has been defined to set thresholds */
|
|
||||||
netif_err(efx, hw, efx->net_dev,
|
|
||||||
"ignoring RX flow control thresholds\n");
|
|
||||||
|
|
||||||
/* Enable event logging */
|
/* Enable event logging */
|
||||||
rc = efx_mcdi_log_ctrl(efx, true, false, 0);
|
rc = efx_mcdi_log_ctrl(efx, true, false, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -514,16 +502,6 @@ static void siena_stop_nic_stats(struct efx_nic *efx)
|
||||||
efx_mcdi_mac_stats(efx, efx->stats_buffer.dma_addr, 0, 0, 0);
|
efx_mcdi_mac_stats(efx, efx->stats_buffer.dma_addr, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void siena_print_fwver(struct efx_nic *efx, char *buf, size_t len)
|
|
||||||
{
|
|
||||||
struct siena_nic_data *nic_data = efx->nic_data;
|
|
||||||
snprintf(buf, len, "%u.%u.%u.%u",
|
|
||||||
(unsigned int)(nic_data->fw_version >> 48),
|
|
||||||
(unsigned int)(nic_data->fw_version >> 32 & 0xffff),
|
|
||||||
(unsigned int)(nic_data->fw_version >> 16 & 0xffff),
|
|
||||||
(unsigned int)(nic_data->fw_version & 0xffff));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Wake on LAN
|
* Wake on LAN
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005 Fen Systems Ltd.
|
* Copyright 2005 Fen Systems Ltd.
|
||||||
* Copyright 2006 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2007-2009 Solarflare Communications Inc.
|
* Copyright 2007-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -196,7 +196,7 @@ static int tenxpress_phy_init(struct efx_nic *efx)
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = efx_mdio_check_mmds(efx, TENXPRESS_REQUIRED_DEVS, 0);
|
rc = efx_mdio_check_mmds(efx, TENXPRESS_REQUIRED_DEVS);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2005-2006 Fen Systems Ltd.
|
* Copyright 2005-2006 Fen Systems Ltd.
|
||||||
* Copyright 2005-2009 Solarflare Communications Inc.
|
* Copyright 2005-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2006-2010 Solarflare Communications Inc.
|
* Copyright 2006-2011 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
@ -193,7 +193,7 @@ static int txc_reset_phy(struct efx_nic *efx)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* Check that all the MMDs we expect are present and responding. */
|
/* Check that all the MMDs we expect are present and responding. */
|
||||||
rc = efx_mdio_check_mmds(efx, TXC_REQUIRED_DEVS, 0);
|
rc = efx_mdio_check_mmds(efx, TXC_REQUIRED_DEVS);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Driver for Solarflare Solarstorm network controllers and boards
|
* Driver for Solarflare Solarstorm network controllers and boards
|
||||||
* Copyright 2006-2009 Solarflare Communications Inc.
|
* Copyright 2006-2010 Solarflare Communications Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 as published
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
|
Loading…
Reference in New Issue