Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (42 commits) MAINTAINERS: Add Andy Gospodarek as co-maintainer. r8169: disable ASPM RxRPC: Fix v1 keys AF_RXRPC: Handle receiving ACKALL packets cnic: Fix lost interrupt on bnx2x cnic: Prevent status block race conditions with hardware net: dcbnl: check correct ops in dcbnl_ieee_set() e1000e: disable broken PHY wakeup for ICH10 LOMs, use MAC wakeup instead igb: fix sparse warning e1000: fix sparse warning netfilter: nf_log: avoid oops in (un)bind with invalid nfproto values dccp: fix oops on Reset after close ipvs: fix dst_lock locking on dest update davinci_emac: Add Carrier Link OK check in Davinci RX Handler bnx2x: update driver version to 1.62.00-6 bnx2x: properly calculate lro_mss bnx2x: perform statistics "action" before state transition. bnx2x: properly configure coefficients for MinBW algorithm (NPAR mode). bnx2x: Fix ethtool -t link test for MF (non-pmf) devices. bnx2x: Fix nvram test for single port devices. ...
This commit is contained in:
Коммит
4438a02fc4
|
@ -40,8 +40,6 @@ decnet.txt
|
|||
- info on using the DECnet networking layer in Linux.
|
||||
depca.txt
|
||||
- the Digital DEPCA/EtherWORKS DE1?? and DE2?? LANCE Ethernet driver
|
||||
dgrs.txt
|
||||
- the Digi International RightSwitch SE-X Ethernet driver
|
||||
dmfe.txt
|
||||
- info on the Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver.
|
||||
e100.txt
|
||||
|
@ -50,8 +48,6 @@ e1000.txt
|
|||
- info on Intel's E1000 line of gigabit ethernet boards
|
||||
eql.txt
|
||||
- serial IP load balancing
|
||||
ethertap.txt
|
||||
- the Ethertap user space packet reception and transmission driver
|
||||
ewrk3.txt
|
||||
- the Digital EtherWORKS 3 DE203/4/5 Ethernet driver
|
||||
filter.txt
|
||||
|
@ -104,8 +100,6 @@ tuntap.txt
|
|||
- TUN/TAP device driver, allowing user space Rx/Tx of packets.
|
||||
vortex.txt
|
||||
- info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards.
|
||||
wavelan.txt
|
||||
- AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver
|
||||
x25.txt
|
||||
- general info on X.25 development.
|
||||
x25-iface.txt
|
||||
|
|
|
@ -1467,6 +1467,7 @@ F: include/net/bluetooth/
|
|||
|
||||
BONDING DRIVER
|
||||
M: Jay Vosburgh <fubar@us.ibm.com>
|
||||
M: Andy Gospodarek <andy@greyhouse.net>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://sourceforge.net/projects/bonding/
|
||||
S: Supported
|
||||
|
@ -2033,7 +2034,7 @@ F: Documentation/scsi/dc395x.txt
|
|||
F: drivers/scsi/dc395x.*
|
||||
|
||||
DCCP PROTOCOL
|
||||
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
|
||||
M: Gerrit Renker <gerrit@erg.abdn.ac.uk>
|
||||
L: dccp@vger.kernel.org
|
||||
W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp
|
||||
S: Maintained
|
||||
|
|
|
@ -62,7 +62,7 @@ void diva_xdi_provide_istream_info (ADAPTER* a,
|
|||
stream interface.
|
||||
If synchronous service was requested, then function
|
||||
does return amount of data written to stream.
|
||||
'final' does indicate that pice of data to be written is
|
||||
'final' does indicate that piece of data to be written is
|
||||
final part of frame (necessary only by structured datatransfer)
|
||||
return 0 if zero lengh packet was written
|
||||
return -1 if stream is full
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* (you will need to reboot afterwards) */
|
||||
/* #define BNX2X_STOP_ON_ERROR */
|
||||
|
||||
#define DRV_MODULE_VERSION "1.62.00-5"
|
||||
#define DRV_MODULE_VERSION "1.62.00-6"
|
||||
#define DRV_MODULE_RELDATE "2011/01/30"
|
||||
#define BNX2X_BC_VER 0x040200
|
||||
|
||||
|
@ -1613,19 +1613,23 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
|
|||
#define BNX2X_BTR 4
|
||||
#define MAX_SPQ_PENDING 8
|
||||
|
||||
|
||||
/* CMNG constants
|
||||
derived from lab experiments, and not from system spec calculations !!! */
|
||||
#define DEF_MIN_RATE 100
|
||||
/* CMNG constants, as derived from system spec calculations */
|
||||
/* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */
|
||||
#define DEF_MIN_RATE 100
|
||||
/* resolution of the rate shaping timer - 100 usec */
|
||||
#define RS_PERIODIC_TIMEOUT_USEC 100
|
||||
/* resolution of fairness algorithm in usecs -
|
||||
coefficient for calculating the actual t fair */
|
||||
#define T_FAIR_COEF 10000000
|
||||
#define RS_PERIODIC_TIMEOUT_USEC 100
|
||||
/* number of bytes in single QM arbitration cycle -
|
||||
coefficient for calculating the fairness timer */
|
||||
#define QM_ARB_BYTES 40000
|
||||
#define FAIR_MEM 2
|
||||
* coefficient for calculating the fairness timer */
|
||||
#define QM_ARB_BYTES 160000
|
||||
/* resolution of Min algorithm 1:100 */
|
||||
#define MIN_RES 100
|
||||
/* how many bytes above threshold for the minimal credit of Min algorithm*/
|
||||
#define MIN_ABOVE_THRESH 32768
|
||||
/* Fairness algorithm integration time coefficient -
|
||||
* for calculating the actual Tfair */
|
||||
#define T_FAIR_COEF ((MIN_ABOVE_THRESH + QM_ARB_BYTES) * 8 * MIN_RES)
|
||||
/* Memory of fairness algorithm . 2 cycles */
|
||||
#define FAIR_MEM 2
|
||||
|
||||
|
||||
#define ATTN_NIG_FOR_FUNC (1L << 8)
|
||||
|
|
|
@ -259,10 +259,44 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Timestamp option length allowed for TPA aggregation:
|
||||
*
|
||||
* nop nop kind length echo val
|
||||
*/
|
||||
#define TPA_TSTAMP_OPT_LEN 12
|
||||
/**
|
||||
* Calculate the approximate value of the MSS for this
|
||||
* aggregation using the first packet of it.
|
||||
*
|
||||
* @param bp
|
||||
* @param parsing_flags Parsing flags from the START CQE
|
||||
* @param len_on_bd Total length of the first packet for the
|
||||
* aggregation.
|
||||
*/
|
||||
static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags,
|
||||
u16 len_on_bd)
|
||||
{
|
||||
/* TPA arrgregation won't have an IP options and TCP options
|
||||
* other than timestamp.
|
||||
*/
|
||||
u16 hdrs_len = ETH_HLEN + sizeof(struct iphdr) + sizeof(struct tcphdr);
|
||||
|
||||
|
||||
/* Check if there was a TCP timestamp, if there is it's will
|
||||
* always be 12 bytes length: nop nop kind length echo val.
|
||||
*
|
||||
* Otherwise FW would close the aggregation.
|
||||
*/
|
||||
if (parsing_flags & PARSING_FLAGS_TIME_STAMP_EXIST_FLAG)
|
||||
hdrs_len += TPA_TSTAMP_OPT_LEN;
|
||||
|
||||
return len_on_bd - hdrs_len;
|
||||
}
|
||||
|
||||
static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
||||
struct sk_buff *skb,
|
||||
struct eth_fast_path_rx_cqe *fp_cqe,
|
||||
u16 cqe_idx)
|
||||
u16 cqe_idx, u16 parsing_flags)
|
||||
{
|
||||
struct sw_rx_page *rx_pg, old_rx_pg;
|
||||
u16 len_on_bd = le16_to_cpu(fp_cqe->len_on_bd);
|
||||
|
@ -275,8 +309,8 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|||
|
||||
/* This is needed in order to enable forwarding support */
|
||||
if (frag_size)
|
||||
skb_shinfo(skb)->gso_size = min((u32)SGE_PAGE_SIZE,
|
||||
max(frag_size, (u32)len_on_bd));
|
||||
skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp, parsing_flags,
|
||||
len_on_bd);
|
||||
|
||||
#ifdef BNX2X_STOP_ON_ERROR
|
||||
if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) {
|
||||
|
@ -344,6 +378,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|||
if (likely(new_skb)) {
|
||||
/* fix ip xsum and give it to the stack */
|
||||
/* (no need to map the new skb) */
|
||||
u16 parsing_flags =
|
||||
le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags);
|
||||
|
||||
prefetch(skb);
|
||||
prefetch(((char *)(skb)) + L1_CACHE_BYTES);
|
||||
|
@ -373,9 +409,9 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
|||
}
|
||||
|
||||
if (!bnx2x_fill_frag_skb(bp, fp, skb,
|
||||
&cqe->fast_path_cqe, cqe_idx)) {
|
||||
if ((le16_to_cpu(cqe->fast_path_cqe.
|
||||
pars_flags.flags) & PARSING_FLAGS_VLAN))
|
||||
&cqe->fast_path_cqe, cqe_idx,
|
||||
parsing_flags)) {
|
||||
if (parsing_flags & PARSING_FLAGS_VLAN)
|
||||
__vlan_hwaccel_put_tag(skb,
|
||||
le16_to_cpu(cqe->fast_path_cqe.
|
||||
vlan_tag));
|
||||
|
@ -703,19 +739,20 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)
|
|||
{
|
||||
u16 line_speed = bp->link_vars.line_speed;
|
||||
if (IS_MF(bp)) {
|
||||
u16 maxCfg = (bp->mf_config[BP_VN(bp)] &
|
||||
FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT;
|
||||
/* Calculate the current MAX line speed limit for the DCC
|
||||
* capable devices
|
||||
u16 maxCfg = bnx2x_extract_max_cfg(bp,
|
||||
bp->mf_config[BP_VN(bp)]);
|
||||
|
||||
/* Calculate the current MAX line speed limit for the MF
|
||||
* devices
|
||||
*/
|
||||
if (IS_MF_SD(bp)) {
|
||||
if (IS_MF_SI(bp))
|
||||
line_speed = (line_speed * maxCfg) / 100;
|
||||
else { /* SD mode */
|
||||
u16 vn_max_rate = maxCfg * 100;
|
||||
|
||||
if (vn_max_rate < line_speed)
|
||||
line_speed = vn_max_rate;
|
||||
} else /* IS_MF_SI(bp)) */
|
||||
line_speed = (line_speed * maxCfg) / 100;
|
||||
}
|
||||
}
|
||||
|
||||
return line_speed;
|
||||
|
|
|
@ -1044,4 +1044,24 @@ static inline void storm_memset_cmng(struct bnx2x *bp,
|
|||
void bnx2x_acquire_phy_lock(struct bnx2x *bp);
|
||||
void bnx2x_release_phy_lock(struct bnx2x *bp);
|
||||
|
||||
/**
|
||||
* Extracts MAX BW part from MF configuration.
|
||||
*
|
||||
* @param bp
|
||||
* @param mf_cfg
|
||||
*
|
||||
* @return u16
|
||||
*/
|
||||
static inline u16 bnx2x_extract_max_cfg(struct bnx2x *bp, u32 mf_cfg)
|
||||
{
|
||||
u16 max_cfg = (mf_cfg & FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT;
|
||||
if (!max_cfg) {
|
||||
BNX2X_ERR("Illegal configuration detected for Max BW - "
|
||||
"using 100 instead\n");
|
||||
max_cfg = 100;
|
||||
}
|
||||
return max_cfg;
|
||||
}
|
||||
|
||||
#endif /* BNX2X_CMN_H */
|
||||
|
|
|
@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|||
speed |= (cmd->speed_hi << 16);
|
||||
|
||||
if (IS_MF_SI(bp)) {
|
||||
u32 param = 0;
|
||||
u32 param = 0, part;
|
||||
u32 line_speed = bp->link_vars.line_speed;
|
||||
|
||||
/* use 10G if no link detected */
|
||||
|
@ -251,9 +251,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|||
REQ_BC_VER_4_SET_MF_BW);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (line_speed < speed) {
|
||||
BNX2X_DEV_INFO("New speed should be less or equal "
|
||||
"to actual line speed\n");
|
||||
part = (speed * 100) / line_speed;
|
||||
if (line_speed < speed || !part) {
|
||||
BNX2X_DEV_INFO("Speed setting should be in a range "
|
||||
"from 1%% to 100%% "
|
||||
"of actual line speed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* load old values */
|
||||
|
@ -263,8 +265,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|||
param &= FUNC_MF_CFG_MIN_BW_MASK;
|
||||
|
||||
/* set new MAX value */
|
||||
param |= (((speed * 100) / line_speed)
|
||||
<< FUNC_MF_CFG_MAX_BW_SHIFT)
|
||||
param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT)
|
||||
& FUNC_MF_CFG_MAX_BW_MASK;
|
||||
|
||||
bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param);
|
||||
|
@ -1781,9 +1782,7 @@ static int bnx2x_test_nvram(struct bnx2x *bp)
|
|||
{ 0x100, 0x350 }, /* manuf_info */
|
||||
{ 0x450, 0xf0 }, /* feature_info */
|
||||
{ 0x640, 0x64 }, /* upgrade_key_info */
|
||||
{ 0x6a4, 0x64 },
|
||||
{ 0x708, 0x70 }, /* manuf_key_info */
|
||||
{ 0x778, 0x70 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
__be32 buf[0x350 / 4];
|
||||
|
@ -1933,11 +1932,11 @@ static void bnx2x_self_test(struct net_device *dev,
|
|||
buf[4] = 1;
|
||||
etest->flags |= ETH_TEST_FL_FAILED;
|
||||
}
|
||||
if (bp->port.pmf)
|
||||
if (bnx2x_link_test(bp, is_serdes) != 0) {
|
||||
buf[5] = 1;
|
||||
etest->flags |= ETH_TEST_FL_FAILED;
|
||||
}
|
||||
|
||||
if (bnx2x_link_test(bp, is_serdes) != 0) {
|
||||
buf[5] = 1;
|
||||
etest->flags |= ETH_TEST_FL_FAILED;
|
||||
}
|
||||
|
||||
#ifdef BNX2X_EXTRA_DEBUG
|
||||
bnx2x_panic_dump(bp);
|
||||
|
|
|
@ -241,7 +241,7 @@ static const struct {
|
|||
/* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't
|
||||
* want to handle "system kill" flow at the moment.
|
||||
*/
|
||||
BLOCK_PRTY_INFO(PXP, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff),
|
||||
BLOCK_PRTY_INFO(PXP, 0x7ffffff, 0x3ffffff, 0x3ffffff, 0x7ffffff),
|
||||
BLOCK_PRTY_INFO_0(PXP2, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(PXP2, 0x7ff, 0x7f, 0x7f, 0x7ff),
|
||||
BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0),
|
||||
|
|
|
@ -1974,13 +1974,22 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)
|
|||
vn_max_rate = 0;
|
||||
|
||||
} else {
|
||||
u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg);
|
||||
|
||||
vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >>
|
||||
FUNC_MF_CFG_MIN_BW_SHIFT) * 100;
|
||||
/* If min rate is zero - set it to 1 */
|
||||
/* If fairness is enabled (not all min rates are zeroes) and
|
||||
if current min rate is zero - set it to 1.
|
||||
This is a requirement of the algorithm. */
|
||||
if (bp->vn_weight_sum && (vn_min_rate == 0))
|
||||
vn_min_rate = DEF_MIN_RATE;
|
||||
vn_max_rate = ((vn_cfg & FUNC_MF_CFG_MAX_BW_MASK) >>
|
||||
FUNC_MF_CFG_MAX_BW_SHIFT) * 100;
|
||||
|
||||
if (IS_MF_SI(bp))
|
||||
/* maxCfg in percents of linkspeed */
|
||||
vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
|
||||
else
|
||||
/* maxCfg is absolute in 100Mb units */
|
||||
vn_max_rate = maxCfg * 100;
|
||||
}
|
||||
|
||||
DP(NETIF_MSG_IFUP,
|
||||
|
@ -2006,7 +2015,8 @@ static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)
|
|||
m_fair_vn.vn_credit_delta =
|
||||
max_t(u32, (vn_min_rate * (T_FAIR_COEF /
|
||||
(8 * bp->vn_weight_sum))),
|
||||
(bp->cmng.fair_vars.fair_threshold * 2));
|
||||
(bp->cmng.fair_vars.fair_threshold +
|
||||
MIN_ABOVE_THRESH));
|
||||
DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta %d\n",
|
||||
m_fair_vn.vn_credit_delta);
|
||||
}
|
||||
|
|
|
@ -1239,14 +1239,14 @@ void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event)
|
|||
if (unlikely(bp->panic))
|
||||
return;
|
||||
|
||||
bnx2x_stats_stm[bp->stats_state][event].action(bp);
|
||||
|
||||
/* Protect a state change flow */
|
||||
spin_lock_bh(&bp->stats_lock);
|
||||
state = bp->stats_state;
|
||||
bp->stats_state = bnx2x_stats_stm[state][event].next_state;
|
||||
spin_unlock_bh(&bp->stats_lock);
|
||||
|
||||
bnx2x_stats_stm[state][event].action(bp);
|
||||
|
||||
if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp))
|
||||
DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n",
|
||||
state, event, bp->stats_state);
|
||||
|
|
|
@ -633,6 +633,7 @@ static const struct net_device_ops softing_netdev_ops = {
|
|||
};
|
||||
|
||||
static const struct can_bittiming_const softing_btr_const = {
|
||||
.name = "softing",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 16,
|
||||
.tseg2_min = 1,
|
||||
|
|
|
@ -2760,6 +2760,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev)
|
|||
u32 status_idx = (u16) *cp->kcq1.status_idx_ptr;
|
||||
int kcqe_cnt;
|
||||
|
||||
/* status block index must be read before reading other fields */
|
||||
rmb();
|
||||
cp->kwq_con_idx = *cp->kwq_con_idx_ptr;
|
||||
|
||||
while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) {
|
||||
|
@ -2770,6 +2772,8 @@ static u32 cnic_service_bnx2_queues(struct cnic_dev *dev)
|
|||
barrier();
|
||||
if (status_idx != *cp->kcq1.status_idx_ptr) {
|
||||
status_idx = (u16) *cp->kcq1.status_idx_ptr;
|
||||
/* status block index must be read first */
|
||||
rmb();
|
||||
cp->kwq_con_idx = *cp->kwq_con_idx_ptr;
|
||||
} else
|
||||
break;
|
||||
|
@ -2888,6 +2892,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info)
|
|||
u32 last_status = *info->status_idx_ptr;
|
||||
int kcqe_cnt;
|
||||
|
||||
/* status block index must be read before reading the KCQ */
|
||||
rmb();
|
||||
while ((kcqe_cnt = cnic_get_kcqes(dev, info))) {
|
||||
|
||||
service_kcqes(dev, kcqe_cnt);
|
||||
|
@ -2898,6 +2904,8 @@ static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info)
|
|||
break;
|
||||
|
||||
last_status = *info->status_idx_ptr;
|
||||
/* status block index must be read before reading the KCQ */
|
||||
rmb();
|
||||
}
|
||||
return last_status;
|
||||
}
|
||||
|
@ -2906,26 +2914,35 @@ static void cnic_service_bnx2x_bh(unsigned long data)
|
|||
{
|
||||
struct cnic_dev *dev = (struct cnic_dev *) data;
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
u32 status_idx;
|
||||
u32 status_idx, new_status_idx;
|
||||
|
||||
if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags)))
|
||||
return;
|
||||
|
||||
status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1);
|
||||
while (1) {
|
||||
status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1);
|
||||
|
||||
CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
|
||||
CNIC_WR16(dev, cp->kcq1.io_addr,
|
||||
cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2);
|
||||
if (!BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
|
||||
status_idx, IGU_INT_ENABLE, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
new_status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2);
|
||||
|
||||
if (new_status_idx != status_idx)
|
||||
continue;
|
||||
|
||||
CNIC_WR16(dev, cp->kcq2.io_addr, cp->kcq2.sw_prod_idx +
|
||||
MAX_KCQ_IDX);
|
||||
|
||||
cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF,
|
||||
status_idx, IGU_INT_ENABLE, 1);
|
||||
} else {
|
||||
cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
|
||||
status_idx, IGU_INT_ENABLE, 1);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1008,7 +1008,7 @@ static void emac_rx_handler(void *token, int len, int status)
|
|||
int ret;
|
||||
|
||||
/* free and bail if we are shutting down */
|
||||
if (unlikely(!netif_running(ndev))) {
|
||||
if (unlikely(!netif_running(ndev) || !netif_carrier_ok(ndev))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -337,8 +337,6 @@ static int dnet_mii_init(struct dnet *bp)
|
|||
for (i = 0; i < PHY_MAX_ADDR; i++)
|
||||
bp->mii_bus->irq[i] = PHY_POLL;
|
||||
|
||||
platform_set_drvdata(bp->dev, bp->mii_bus);
|
||||
|
||||
if (mdiobus_register(bp->mii_bus)) {
|
||||
err = -ENXIO;
|
||||
goto err_out_free_mdio_irq;
|
||||
|
@ -863,6 +861,7 @@ static int __devinit dnet_probe(struct platform_device *pdev)
|
|||
bp = netdev_priv(dev);
|
||||
bp->dev = dev;
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
||||
spin_lock_init(&bp->lock);
|
||||
|
|
|
@ -42,7 +42,8 @@
|
|||
#define GBE_CONFIG_RAM_BASE \
|
||||
((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET))
|
||||
|
||||
#define GBE_CONFIG_BASE_VIRT phys_to_virt(GBE_CONFIG_RAM_BASE)
|
||||
#define GBE_CONFIG_BASE_VIRT \
|
||||
((void __iomem *)phys_to_virt(GBE_CONFIG_RAM_BASE))
|
||||
|
||||
#define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \
|
||||
(iowrite16_rep(base + offset, data, count))
|
||||
|
|
|
@ -5967,7 +5967,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|||
/* APME bit in EEPROM is mapped to WUC.APME */
|
||||
eeprom_data = er32(WUC);
|
||||
eeprom_apme_mask = E1000_WUC_APME;
|
||||
if (eeprom_data & E1000_WUC_PHY_WAKE)
|
||||
if ((hw->mac.type > e1000_ich10lan) &&
|
||||
(eeprom_data & E1000_WUC_PHY_WAKE))
|
||||
adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
|
||||
} else if (adapter->flags & FLAG_APME_IN_CTRL3) {
|
||||
if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
|
||||
|
|
|
@ -74,7 +74,8 @@ static struct platform_device_id fec_devtype[] = {
|
|||
}, {
|
||||
.name = "imx28-fec",
|
||||
.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME,
|
||||
}
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static unsigned char macaddr[ETH_ALEN];
|
||||
|
|
|
@ -220,7 +220,7 @@ static u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr)
|
|||
* The parameter rar_count will usually be hw->mac.rar_entry_count
|
||||
* unless there are workarounds that change this.
|
||||
**/
|
||||
void e1000_update_mc_addr_list_vf(struct e1000_hw *hw,
|
||||
static void e1000_update_mc_addr_list_vf(struct e1000_hw *hw,
|
||||
u8 *mc_addr_list, u32 mc_addr_count,
|
||||
u32 rar_used_count, u32 rar_count)
|
||||
{
|
||||
|
|
|
@ -260,7 +260,7 @@ static int macb_mii_init(struct macb *bp)
|
|||
for (i = 0; i < PHY_MAX_ADDR; i++)
|
||||
bp->mii_bus->irq[i] = PHY_POLL;
|
||||
|
||||
platform_set_drvdata(bp->dev, bp->mii_bus);
|
||||
dev_set_drvdata(&bp->dev->dev, bp->mii_bus);
|
||||
|
||||
if (mdiobus_register(bp->mii_bus))
|
||||
goto err_out_free_mdio_irq;
|
||||
|
|
|
@ -691,6 +691,7 @@ static struct pcmcia_device_id fmvj18x_ids[] = {
|
|||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0b05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
|
||||
PCMCIA_DEVICE_NULL,
|
||||
};
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -3020,6 +3021,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
mii->reg_num_mask = 0x1f;
|
||||
mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
|
||||
|
||||
/* disable ASPM completely as that cause random device stop working
|
||||
* problems as well as full system hangs for some PCIe devices users */
|
||||
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
|
||||
PCIE_LINK_STATE_CLKPM);
|
||||
|
||||
/* enable device (incl. PCI PM wakeup and hotplug setup) */
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc < 0) {
|
||||
|
|
|
@ -3856,9 +3856,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
|
|||
memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN);
|
||||
memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
|
||||
|
||||
/* device is off until link detection */
|
||||
netif_carrier_off(dev);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
|
|
@ -219,8 +219,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev)
|
|||
struct tx_buf *tx_buf = NULL;
|
||||
struct sk_buff *nskb = NULL;
|
||||
int ret = 0, i;
|
||||
u16 *hdr, tx_skb_cnt = 0;
|
||||
u16 tx_skb_cnt = 0;
|
||||
u8 *buf;
|
||||
__le16 *hdr;
|
||||
|
||||
if (hif_dev->tx.tx_skb_cnt == 0)
|
||||
return 0;
|
||||
|
@ -245,9 +246,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev)
|
|||
|
||||
buf = tx_buf->buf;
|
||||
buf += tx_buf->offset;
|
||||
hdr = (u16 *)buf;
|
||||
*hdr++ = nskb->len;
|
||||
*hdr++ = ATH_USB_TX_STREAM_MODE_TAG;
|
||||
hdr = (__le16 *)buf;
|
||||
*hdr++ = cpu_to_le16(nskb->len);
|
||||
*hdr++ = cpu_to_le16(ATH_USB_TX_STREAM_MODE_TAG);
|
||||
buf += 4;
|
||||
memcpy(buf, nskb->data, nskb->len);
|
||||
tx_buf->len = nskb->len + 4;
|
||||
|
|
|
@ -885,7 +885,7 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
|
|||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
|
||||
if (!(ints & ATH9K_INT_GLOBAL))
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
|
||||
ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
|
||||
|
||||
|
@ -963,7 +963,8 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
|
|||
REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
|
||||
}
|
||||
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
if (ints & ATH9K_INT_GLOBAL)
|
||||
ath9k_hw_enable_interrupts(ah);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -118,6 +118,8 @@ static struct usb_device_id carl9170_usb_ids[] = {
|
|||
{ USB_DEVICE(0x057c, 0x8402) },
|
||||
/* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */
|
||||
{ USB_DEVICE(0x1668, 0x1200) },
|
||||
/* Airlive X.USB a/b/g/n */
|
||||
{ USB_DEVICE(0x1b75, 0x9170) },
|
||||
|
||||
/* terminate */
|
||||
{}
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
#include "iwl-agn-debugfs.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL5000_UCODE_API_MAX 2
|
||||
#define IWL5000_UCODE_API_MAX 5
|
||||
#define IWL5150_UCODE_API_MAX 2
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
|
|
|
@ -98,6 +98,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
|
||||
{USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
|
||||
{USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
|
||||
{USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
|
||||
{USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
|
||||
{USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
|
||||
|
|
|
@ -2597,6 +2597,9 @@ static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
|
|||
__le32 mode;
|
||||
int ret;
|
||||
|
||||
if (priv->device_type != RNDIS_BCM4320B)
|
||||
return -ENOTSUPP;
|
||||
|
||||
netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__,
|
||||
enabled ? "enabled" : "disabled",
|
||||
timeout);
|
||||
|
|
|
@ -712,6 +712,7 @@ static struct pcmcia_device_id serial_ids[] = {
|
|||
PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
|
||||
PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
|
||||
PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
|
||||
|
|
|
@ -346,14 +346,19 @@ static void pn_rx_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
|
||||
if (unlikely(!skb))
|
||||
break;
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, 0,
|
||||
req->actual);
|
||||
|
||||
if (skb->len == 0) { /* First fragment */
|
||||
skb->protocol = htons(ETH_P_PHONET);
|
||||
skb_reset_mac_header(skb);
|
||||
/* Can't use pskb_pull() on page in IRQ */
|
||||
memcpy(skb_put(skb, 1), page_address(page), 1);
|
||||
}
|
||||
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
|
||||
skb->len == 0, req->actual);
|
||||
page = NULL;
|
||||
|
||||
if (req->actual < req->length) { /* Last fragment */
|
||||
skb->protocol = htons(ETH_P_PHONET);
|
||||
skb_reset_mac_header(skb);
|
||||
pskb_pull(skb, 1);
|
||||
skb->dev = dev;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += skb->len;
|
||||
|
|
|
@ -99,7 +99,6 @@ struct rxrpc_key_token {
|
|||
* structure of raw payloads passed to add_key() or instantiate key
|
||||
*/
|
||||
struct rxrpc_key_data_v1 {
|
||||
u32 kif_version; /* 1 */
|
||||
u16 security_index;
|
||||
u16 ticket_length;
|
||||
u32 expiry; /* time_t */
|
||||
|
|
|
@ -148,7 +148,7 @@ nla_policy_len(const struct nla_policy *p, int n)
|
|||
{
|
||||
int i, len = 0;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
for (i = 0; i < n; i++, p++) {
|
||||
if (p->len)
|
||||
len += nla_total_size(p->len);
|
||||
else if (nla_attr_minlen[p->type])
|
||||
|
|
|
@ -144,7 +144,7 @@ void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,
|
|||
|
||||
list_for_each_entry(ha, &from_list->list, list) {
|
||||
type = addr_type ? addr_type : ha->type;
|
||||
__hw_addr_del(to_list, ha->addr, addr_len, addr_type);
|
||||
__hw_addr_del(to_list, ha->addr, addr_len, type);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(__hw_addr_del_multiple);
|
||||
|
|
|
@ -1193,7 +1193,7 @@ static int dcbnl_ieee_set(struct net_device *netdev, struct nlattr **tb,
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setets) {
|
||||
if (ieee[DCB_ATTR_IEEE_PFC] && ops->ieee_setpfc) {
|
||||
struct ieee_pfc *pfc = nla_data(ieee[DCB_ATTR_IEEE_PFC]);
|
||||
err = ops->ieee_setpfc(netdev, pfc);
|
||||
if (err)
|
||||
|
|
|
@ -614,6 +614,9 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
/* Caller (dccp_v4_do_rcv) will send Reset */
|
||||
dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||
return 1;
|
||||
} else if (sk->sk_state == DCCP_CLOSED) {
|
||||
dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) {
|
||||
|
@ -668,10 +671,6 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
switch (sk->sk_state) {
|
||||
case DCCP_CLOSED:
|
||||
dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||
return 1;
|
||||
|
||||
case DCCP_REQUESTING:
|
||||
queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);
|
||||
if (queued >= 0)
|
||||
|
|
|
@ -2557,14 +2557,16 @@ static
|
|||
int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
struct net *net = current->nsproxy->net_ns;
|
||||
int delay = net->ipv6.sysctl.flush_delay;
|
||||
if (write) {
|
||||
proc_dointvec(ctl, write, buffer, lenp, ppos);
|
||||
fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net);
|
||||
return 0;
|
||||
} else
|
||||
struct net *net;
|
||||
int delay;
|
||||
if (!write)
|
||||
return -EINVAL;
|
||||
|
||||
net = (struct net *)ctl->extra1;
|
||||
delay = net->ipv6.sysctl.flush_delay;
|
||||
proc_dointvec(ctl, write, buffer, lenp, ppos);
|
||||
fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ctl_table ipv6_route_table_template[] = {
|
||||
|
@ -2651,6 +2653,7 @@ struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
|
|||
|
||||
if (table) {
|
||||
table[0].data = &net->ipv6.sysctl.flush_delay;
|
||||
table[0].extra1 = net;
|
||||
table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
|
||||
table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;
|
||||
table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
|
||||
|
|
|
@ -808,9 +808,9 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,
|
|||
dest->u_threshold = udest->u_threshold;
|
||||
dest->l_threshold = udest->l_threshold;
|
||||
|
||||
spin_lock(&dest->dst_lock);
|
||||
spin_lock_bh(&dest->dst_lock);
|
||||
ip_vs_dst_reset(dest);
|
||||
spin_unlock(&dest->dst_lock);
|
||||
spin_unlock_bh(&dest->dst_lock);
|
||||
|
||||
if (add)
|
||||
ip_vs_new_estimator(&dest->stats);
|
||||
|
|
|
@ -85,6 +85,8 @@ EXPORT_SYMBOL(nf_log_unregister);
|
|||
|
||||
int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger)
|
||||
{
|
||||
if (pf >= ARRAY_SIZE(nf_loggers))
|
||||
return -EINVAL;
|
||||
mutex_lock(&nf_log_mutex);
|
||||
if (__find_logger(pf, logger->name) == NULL) {
|
||||
mutex_unlock(&nf_log_mutex);
|
||||
|
@ -98,6 +100,8 @@ EXPORT_SYMBOL(nf_log_bind_pf);
|
|||
|
||||
void nf_log_unbind_pf(u_int8_t pf)
|
||||
{
|
||||
if (pf >= ARRAY_SIZE(nf_loggers))
|
||||
return;
|
||||
mutex_lock(&nf_log_mutex);
|
||||
rcu_assign_pointer(nf_loggers[pf], NULL);
|
||||
mutex_unlock(&nf_log_mutex);
|
||||
|
|
|
@ -1407,7 +1407,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
|||
int noblock = flags&MSG_DONTWAIT;
|
||||
size_t copied;
|
||||
struct sk_buff *skb, *data_skb;
|
||||
int err;
|
||||
int err, ret;
|
||||
|
||||
if (flags&MSG_OOB)
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -1470,8 +1470,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
|||
|
||||
skb_free_datagram(sk, skb);
|
||||
|
||||
if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2)
|
||||
netlink_dump(sk);
|
||||
if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
|
||||
ret = netlink_dump(sk);
|
||||
if (ret) {
|
||||
sk->sk_err = ret;
|
||||
sk->sk_error_report(sk);
|
||||
}
|
||||
}
|
||||
|
||||
scm_recv(sock, msg, siocb->scm, flags);
|
||||
out:
|
||||
|
@ -1736,6 +1741,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
|
|||
struct netlink_callback *cb;
|
||||
struct sock *sk;
|
||||
struct netlink_sock *nlk;
|
||||
int ret;
|
||||
|
||||
cb = kzalloc(sizeof(*cb), GFP_KERNEL);
|
||||
if (cb == NULL)
|
||||
|
@ -1764,9 +1770,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
|
|||
nlk->cb = cb;
|
||||
mutex_unlock(nlk->cb_mutex);
|
||||
|
||||
netlink_dump(sk);
|
||||
ret = netlink_dump(sk);
|
||||
|
||||
sock_put(sk);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* We successfully started a dump, by returning -EINTR we
|
||||
* signal not to send ACK even if it was requested.
|
||||
*/
|
||||
|
|
|
@ -423,6 +423,7 @@ void rxrpc_fast_process_packet(struct rxrpc_call *call, struct sk_buff *skb)
|
|||
goto protocol_error;
|
||||
}
|
||||
|
||||
case RXRPC_PACKET_TYPE_ACKALL:
|
||||
case RXRPC_PACKET_TYPE_ACK:
|
||||
/* ACK processing is done in process context */
|
||||
read_lock_bh(&call->state_lock);
|
||||
|
|
Загрузка…
Ссылка в новой задаче