forked from luck/tmp_suning_uos_patched
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/can/usb/ems_usb.c
This commit is contained in:
commit
d0e1e88d6e
|
@ -477,62 +477,62 @@ static void
|
|||
modem_set_init(struct IsdnCardState *cs) {
|
||||
int timeout;
|
||||
|
||||
#define RCV_DELAY 20000
|
||||
#define RCV_DELAY 20
|
||||
modem_write_cmd(cs, MInit_1, strlen(MInit_1));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_2, strlen(MInit_2));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_3, strlen(MInit_3));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_4, strlen(MInit_4));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY );
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_5, strlen(MInit_5));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_6, strlen(MInit_6));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_7, strlen(MInit_7));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
}
|
||||
|
||||
static void
|
||||
modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
||||
int timeout;
|
||||
#define RCV_DELAY 20000
|
||||
#define RCV_DELAY 20
|
||||
|
||||
modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
if (outgoing)
|
||||
modem_write_cmd(cs, MInit_dialout, strlen(MInit_dialout));
|
||||
else
|
||||
|
@ -541,7 +541,7 @@ modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
|||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -269,6 +269,8 @@ struct be_adapter {
|
|||
u32 port_num;
|
||||
bool promiscuous;
|
||||
u32 cap;
|
||||
u32 rx_fc; /* Rx flow control */
|
||||
u32 tx_fc; /* Tx flow control */
|
||||
};
|
||||
|
||||
extern const struct ethtool_ops be_ethtool_ops;
|
||||
|
|
|
@ -362,10 +362,12 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
|||
|
||||
if (ecmd->autoneg != 0)
|
||||
return -EINVAL;
|
||||
adapter->tx_fc = ecmd->tx_pause;
|
||||
adapter->rx_fc = ecmd->rx_pause;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, ecmd->tx_pause,
|
||||
ecmd->rx_pause);
|
||||
if (!status)
|
||||
status = be_cmd_set_flow_control(adapter,
|
||||
adapter->tx_fc, adapter->rx_fc);
|
||||
if (status)
|
||||
dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
|
||||
|
||||
return status;
|
||||
|
|
|
@ -1611,11 +1611,21 @@ static int be_open(struct net_device *netdev)
|
|||
status = be_cmd_link_status_query(adapter, &link_up, &mac_speed,
|
||||
&link_speed);
|
||||
if (status)
|
||||
return status;
|
||||
goto ret_sts;
|
||||
be_link_status_update(adapter, link_up);
|
||||
|
||||
status = be_vid_config(adapter);
|
||||
if (status)
|
||||
goto ret_sts;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter,
|
||||
adapter->tx_fc, adapter->rx_fc);
|
||||
if (status)
|
||||
goto ret_sts;
|
||||
|
||||
schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
|
||||
return 0;
|
||||
ret_sts:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int be_setup(struct be_adapter *adapter)
|
||||
|
@ -1649,17 +1659,8 @@ static int be_setup(struct be_adapter *adapter)
|
|||
if (status != 0)
|
||||
goto rx_qs_destroy;
|
||||
|
||||
status = be_vid_config(adapter);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, true, true);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
return 0;
|
||||
|
||||
mccqs_destroy:
|
||||
be_mcc_queues_destroy(adapter);
|
||||
rx_qs_destroy:
|
||||
be_rx_queues_destroy(adapter);
|
||||
tx_qs_destroy:
|
||||
|
@ -1910,6 +1911,10 @@ static void be_netdev_init(struct net_device *netdev)
|
|||
|
||||
adapter->rx_csum = true;
|
||||
|
||||
/* Default settings for Rx and Tx flow control */
|
||||
adapter->rx_fc = true;
|
||||
adapter->tx_fc = true;
|
||||
|
||||
netif_set_gso_max_size(netdev, 65535);
|
||||
|
||||
BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
|
||||
|
@ -2172,6 +2177,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
be_close(netdev);
|
||||
rtnl_unlock();
|
||||
}
|
||||
be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc);
|
||||
be_clear(adapter);
|
||||
|
||||
pci_save_state(pdev);
|
||||
|
|
|
@ -637,6 +637,22 @@ static int can_changelink(struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t can_get_size(const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
size_t size;
|
||||
|
||||
size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */
|
||||
size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */
|
||||
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */
|
||||
size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */
|
||||
size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */
|
||||
if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */
|
||||
size += sizeof(struct can_bittiming_const);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
|
@ -687,6 +703,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {
|
|||
.setup = can_setup,
|
||||
.newlink = can_newlink,
|
||||
.changelink = can_changelink,
|
||||
.get_size = can_get_size,
|
||||
.fill_info = can_fill_info,
|
||||
.fill_xstats = can_fill_xstats,
|
||||
};
|
||||
|
|
|
@ -315,7 +315,7 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
|
|||
if (skb == NULL)
|
||||
return;
|
||||
|
||||
cf->can_id = msg->msg.can_msg.id;
|
||||
cf->can_id = le32_to_cpu(msg->msg.can_msg.id);
|
||||
cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8);
|
||||
|
||||
if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME
|
||||
|
@ -801,6 +801,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
|
|||
msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc;
|
||||
}
|
||||
|
||||
/* Respect byte order */
|
||||
msg->msg.can_msg.id = cpu_to_le32(msg->msg.can_msg.id);
|
||||
|
||||
for (i = 0; i < MAX_TX_URBS; i++) {
|
||||
if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) {
|
||||
context = &dev->tx_contexts[i];
|
||||
|
|
|
@ -4342,11 +4342,11 @@ static int cas_open(struct net_device *dev)
|
|||
cas_unlock_all_restore(cp, flags);
|
||||
}
|
||||
|
||||
err = -ENOMEM;
|
||||
if (cas_tx_tiny_alloc(cp) < 0)
|
||||
return -ENOMEM;
|
||||
goto err_unlock;
|
||||
|
||||
/* alloc rx descriptors */
|
||||
err = -ENOMEM;
|
||||
if (cas_alloc_rxds(cp) < 0)
|
||||
goto err_tx_tiny;
|
||||
|
||||
|
@ -4386,6 +4386,7 @@ static int cas_open(struct net_device *dev)
|
|||
cas_free_rxds(cp);
|
||||
err_tx_tiny:
|
||||
cas_tx_tiny_free(cp);
|
||||
err_unlock:
|
||||
mutex_unlock(&cp->pm_mutex);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -462,3 +462,4 @@ void fsl_pq_mdio_exit(void)
|
|||
of_unregister_platform_driver(&fsl_pq_mdio_driver);
|
||||
}
|
||||
module_exit(fsl_pq_mdio_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
|
||||
#include "ixgbe.h"
|
||||
#include "ixgbe_common.h"
|
||||
#include "ixgbe_dcb_82599.h"
|
||||
|
||||
char ixgbe_driver_name[] = "ixgbe";
|
||||
static const char ixgbe_driver_string[] =
|
||||
|
@ -228,6 +229,56 @@ static void ixgbe_unmap_and_free_tx_resource(struct ixgbe_adapter *adapter,
|
|||
/* tx_buffer_info must be completely set up in the transmit path */
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_tx_is_paused - check if the tx ring is paused
|
||||
* @adapter: the ixgbe adapter
|
||||
* @tx_ring: the corresponding tx_ring
|
||||
*
|
||||
* If not in DCB mode, checks TFCS.TXOFF, otherwise, find out the
|
||||
* corresponding TC of this tx_ring when checking TFCS.
|
||||
*
|
||||
* Returns : true if paused
|
||||
*/
|
||||
static inline bool ixgbe_tx_is_paused(struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring)
|
||||
{
|
||||
int tc;
|
||||
u32 txoff = IXGBE_TFCS_TXOFF;
|
||||
|
||||
#ifdef CONFIG_IXGBE_DCB
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
int reg_idx = tx_ring->reg_idx;
|
||||
int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
|
||||
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
tc = reg_idx >> 2;
|
||||
txoff = IXGBE_TFCS_TXOFF0;
|
||||
} else if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
tc = 0;
|
||||
txoff = IXGBE_TFCS_TXOFF;
|
||||
if (dcb_i == 8) {
|
||||
/* TC0, TC1 */
|
||||
tc = reg_idx >> 5;
|
||||
if (tc == 2) /* TC2, TC3 */
|
||||
tc += (reg_idx - 64) >> 4;
|
||||
else if (tc == 3) /* TC4, TC5, TC6, TC7 */
|
||||
tc += 1 + ((reg_idx - 96) >> 3);
|
||||
} else if (dcb_i == 4) {
|
||||
/* TC0, TC1 */
|
||||
tc = reg_idx >> 6;
|
||||
if (tc == 1) {
|
||||
tc += (reg_idx - 64) >> 5;
|
||||
if (tc == 2) /* TC2, TC3 */
|
||||
tc += (reg_idx - 96) >> 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
txoff <<= tc;
|
||||
}
|
||||
#endif
|
||||
return IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & txoff;
|
||||
}
|
||||
|
||||
static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring,
|
||||
unsigned int eop)
|
||||
|
@ -239,7 +290,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
|||
adapter->detect_tx_hung = false;
|
||||
if (tx_ring->tx_buffer_info[eop].time_stamp &&
|
||||
time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) &&
|
||||
!(IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)) {
|
||||
!ixgbe_tx_is_paused(adapter, tx_ring)) {
|
||||
/* detected Tx unit hang */
|
||||
union ixgbe_adv_tx_desc *tx_desc;
|
||||
tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
|
||||
|
@ -414,19 +465,23 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter,
|
|||
u32 txctrl;
|
||||
int cpu = get_cpu();
|
||||
int q = tx_ring - adapter->tx_ring;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
||||
if (tx_ring->cpu != cpu) {
|
||||
txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q));
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q));
|
||||
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK;
|
||||
txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu);
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(q), txctrl);
|
||||
} else if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(q));
|
||||
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599;
|
||||
txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) <<
|
||||
IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599);
|
||||
IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599);
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(q), txctrl);
|
||||
}
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q), txctrl);
|
||||
tx_ring->cpu = cpu;
|
||||
}
|
||||
put_cpu();
|
||||
|
@ -1908,11 +1963,25 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
u32 rttdcs;
|
||||
|
||||
/* disable the arbiter while setting MTQC */
|
||||
rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
|
||||
rttdcs |= IXGBE_RTTDCS_ARBDIS;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
|
||||
|
||||
/* We enable 8 traffic classes, DCB only */
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA |
|
||||
IXGBE_MTQC_8TC_8TQ));
|
||||
else
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
|
||||
|
||||
/* re-eable the arbiter */
|
||||
rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2466,7 +2535,10 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter)
|
|||
ixgbe_restore_vlan(adapter);
|
||||
#ifdef CONFIG_IXGBE_DCB
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
netif_set_gso_max_size(netdev, 32768);
|
||||
if (hw->mac.type == ixgbe_mac_82598EB)
|
||||
netif_set_gso_max_size(netdev, 32768);
|
||||
else
|
||||
netif_set_gso_max_size(netdev, 65536);
|
||||
ixgbe_configure_dcb(adapter);
|
||||
} else {
|
||||
netif_set_gso_max_size(netdev, 65536);
|
||||
|
|
|
@ -223,69 +223,73 @@ static int __devinit macsonic_init(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
#define INVALID_MAC(mac) (memcmp(mac, "\x08\x00\x07", 3) && \
|
||||
memcmp(mac, "\x00\xA0\x40", 3) && \
|
||||
memcmp(mac, "\x00\x80\x19", 3) && \
|
||||
memcmp(mac, "\x00\x05\x02", 3))
|
||||
|
||||
static void __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
{
|
||||
struct sonic_local *lp = netdev_priv(dev);
|
||||
const int prom_addr = ONBOARD_SONIC_PROM_BASE;
|
||||
int i;
|
||||
unsigned short val;
|
||||
|
||||
/* On NuBus boards we can sometimes look in the ROM resources.
|
||||
No such luck for comm-slot/onboard. */
|
||||
for(i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
||||
/*
|
||||
* On NuBus boards we can sometimes look in the ROM resources.
|
||||
* No such luck for comm-slot/onboard.
|
||||
* On the PowerBook 520, the PROM base address is a mystery.
|
||||
*/
|
||||
if (hwreg_present((void *)prom_addr)) {
|
||||
int i;
|
||||
|
||||
/* Most of the time, the address is bit-reversed. The NetBSD
|
||||
source has a rather long and detailed historical account of
|
||||
why this is so. */
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
bit_reverse_addr(dev->dev_addr);
|
||||
else
|
||||
return 0;
|
||||
for (i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/* If we still have what seems to be a bogus address, we'll
|
||||
look in the CAM. The top entry should be ours. */
|
||||
/* Danger! This only works if MacOS has already initialized
|
||||
the card... */
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
{
|
||||
unsigned short val;
|
||||
|
||||
printk(KERN_INFO "macsonic: PROM seems to be wrong, trying CAM entry 15\n");
|
||||
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
SONIC_WRITE(SONIC_CEP, 15);
|
||||
|
||||
val = SONIC_READ(SONIC_CAP2);
|
||||
dev->dev_addr[5] = val >> 8;
|
||||
dev->dev_addr[4] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP1);
|
||||
dev->dev_addr[3] = val >> 8;
|
||||
dev->dev_addr[2] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP0);
|
||||
dev->dev_addr[1] = val >> 8;
|
||||
dev->dev_addr[0] = val & 0xff;
|
||||
|
||||
printk(KERN_INFO "HW Address from CAM 15: %pM\n",
|
||||
dev->dev_addr);
|
||||
} else return 0;
|
||||
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
{
|
||||
/*
|
||||
* Still nonsense ... messed up someplace!
|
||||
* Most of the time, the address is bit-reversed. The NetBSD
|
||||
* source has a rather long and detailed historical account of
|
||||
* why this is so.
|
||||
*/
|
||||
printk(KERN_ERR "macsonic: ERROR (INVALID MAC)\n");
|
||||
return -EIO;
|
||||
} else return 0;
|
||||
bit_reverse_addr(dev->dev_addr);
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/*
|
||||
* If we still have what seems to be a bogus address, we'll
|
||||
* look in the CAM. The top entry should be ours.
|
||||
*/
|
||||
printk(KERN_WARNING "macsonic: MAC address in PROM seems "
|
||||
"to be invalid, trying CAM\n");
|
||||
} else {
|
||||
printk(KERN_WARNING "macsonic: cannot read MAC address from "
|
||||
"PROM, trying CAM\n");
|
||||
}
|
||||
|
||||
/* This only works if MacOS has already initialized the card. */
|
||||
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
SONIC_WRITE(SONIC_CEP, 15);
|
||||
|
||||
val = SONIC_READ(SONIC_CAP2);
|
||||
dev->dev_addr[5] = val >> 8;
|
||||
dev->dev_addr[4] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP1);
|
||||
dev->dev_addr[3] = val >> 8;
|
||||
dev->dev_addr[2] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP0);
|
||||
dev->dev_addr[1] = val >> 8;
|
||||
dev->dev_addr[0] = val & 0xff;
|
||||
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/* Still nonsense ... messed up someplace! */
|
||||
|
||||
printk(KERN_WARNING "macsonic: MAC address in CAM entry 15 "
|
||||
"seems invalid, will use a random MAC\n");
|
||||
random_ether_addr(dev->dev_addr);
|
||||
}
|
||||
|
||||
static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
|
||||
|
@ -402,8 +406,7 @@ static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
|
|||
SONIC_WRITE(SONIC_ISR, 0x7fff);
|
||||
|
||||
/* Now look for the MAC address. */
|
||||
if (mac_onboard_sonic_ethernet_addr(dev) != 0)
|
||||
return -ENODEV;
|
||||
mac_onboard_sonic_ethernet_addr(dev);
|
||||
|
||||
/* Shared init code */
|
||||
return macsonic_init(dev);
|
||||
|
|
|
@ -4145,6 +4145,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
/* Set PCIe reset type for EEH to fundamental. */
|
||||
pdev->needs_freset = 1;
|
||||
pci_save_state(pdev);
|
||||
qdev->reg_base =
|
||||
ioremap_nocache(pci_resource_start(pdev, 1),
|
||||
|
|
|
@ -483,7 +483,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
|||
/* Wait for the interrupt to come in. */
|
||||
status = ql_wait_mbx_cmd_cmplt(qdev);
|
||||
if (status)
|
||||
goto end;
|
||||
continue;
|
||||
|
||||
/* Process the event. If it's an AEN, it
|
||||
* will be handled in-line or a worker
|
||||
|
|
|
@ -6325,10 +6325,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
|||
|
||||
fail:
|
||||
if (dev) {
|
||||
if (registered) {
|
||||
unregister_ieee80211(priv->ieee);
|
||||
if (registered)
|
||||
unregister_netdev(dev);
|
||||
}
|
||||
|
||||
ipw2100_hw_stop_adapter(priv);
|
||||
|
||||
|
@ -6385,7 +6383,6 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
|
|||
/* Unregister the device first - this results in close()
|
||||
* being called if the device is open. If we free storage
|
||||
* first, then close() will crash. */
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(dev);
|
||||
|
||||
/* ipw2100_down will ensure that there is no more pending work
|
||||
|
|
|
@ -11822,7 +11822,6 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
|||
if (err) {
|
||||
IPW_ERROR("Failed to register promiscuous network "
|
||||
"device (error %d).\n", err);
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(priv->net_dev);
|
||||
goto out_remove_sysfs;
|
||||
}
|
||||
|
@ -11873,7 +11872,6 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev)
|
|||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(priv->net_dev);
|
||||
|
||||
if (priv->rxq) {
|
||||
|
|
|
@ -1020,7 +1020,6 @@ static inline int libipw_is_cck_rate(u8 rate)
|
|||
/* ieee80211.c */
|
||||
extern void free_ieee80211(struct net_device *dev, int monitor);
|
||||
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
||||
extern void unregister_ieee80211(struct libipw_device *ieee);
|
||||
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
||||
|
||||
extern void libipw_networks_age(struct libipw_device *ieee,
|
||||
|
|
|
@ -235,19 +235,16 @@ void free_ieee80211(struct net_device *dev, int monitor)
|
|||
libipw_networks_free(ieee);
|
||||
|
||||
/* free cfg80211 resources */
|
||||
if (!monitor)
|
||||
if (!monitor) {
|
||||
wiphy_unregister(ieee->wdev.wiphy);
|
||||
kfree(ieee->a_band.channels);
|
||||
kfree(ieee->bg_band.channels);
|
||||
wiphy_free(ieee->wdev.wiphy);
|
||||
}
|
||||
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
void unregister_ieee80211(struct libipw_device *ieee)
|
||||
{
|
||||
wiphy_unregister(ieee->wdev.wiphy);
|
||||
kfree(ieee->a_band.channels);
|
||||
kfree(ieee->bg_band.channels);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LIBIPW_DEBUG
|
||||
|
||||
static int debug = 0;
|
||||
|
@ -333,4 +330,3 @@ module_init(libipw_init);
|
|||
|
||||
EXPORT_SYMBOL(alloc_ieee80211);
|
||||
EXPORT_SYMBOL(free_ieee80211);
|
||||
EXPORT_SYMBOL(unregister_ieee80211);
|
||||
|
|
|
@ -815,6 +815,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
|||
|
||||
mutex_init(&rt2x00dev->csr_mutex);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
/*
|
||||
* Make room for rt2x00_intf inside the per-interface
|
||||
* structure ieee80211_vif.
|
||||
|
@ -871,8 +873,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
|||
rt2x00leds_register(rt2x00dev);
|
||||
rt2x00debug_register(rt2x00dev);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
|
|
|
@ -362,8 +362,9 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
|
|||
|
||||
rt2x00link_reset_tuner(rt2x00dev, false);
|
||||
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
}
|
||||
|
||||
void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
|
@ -469,8 +470,10 @@ static void rt2x00link_tuner(struct work_struct *work)
|
|||
* Increase tuner counter, and reschedule the next link tuner run.
|
||||
*/
|
||||
link->count++;
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
|
||||
if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
}
|
||||
|
||||
void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
|
||||
|
|
|
@ -47,6 +47,8 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
|||
(requesttype == USB_VENDOR_REQUEST_IN) ?
|
||||
usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
status = usb_control_msg(usb_dev, pipe, request, requesttype,
|
||||
|
@ -60,8 +62,10 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
|||
* -ENODEV: Device has disappeared, no point continuing.
|
||||
* All other errors: Try again.
|
||||
*/
|
||||
else if (status == -ENODEV)
|
||||
else if (status == -ENODEV) {
|
||||
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev,
|
||||
|
@ -161,6 +165,9 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00usb_register_read_lock(rt2x00dev, offset, reg);
|
||||
if (!rt2x00_get_field32(*reg, field))
|
||||
|
|
|
@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
|
|||
|
||||
/* turn the LED off before exiting */
|
||||
ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
rtl8187_unregister_led(&priv->led_rx);
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
}
|
||||
#endif /* def CONFIG_RTL8187_LED */
|
||||
|
||||
|
|
|
@ -132,23 +132,27 @@ static inline struct bcm_sock *bcm_sk(const struct sock *sk)
|
|||
/*
|
||||
* procfs functions
|
||||
*/
|
||||
static char *bcm_proc_getifname(int ifindex)
|
||||
static char *bcm_proc_getifname(char *result, int ifindex)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
if (!ifindex)
|
||||
return "any";
|
||||
|
||||
/* no usage counting */
|
||||
read_lock(&dev_base_lock);
|
||||
dev = __dev_get_by_index(&init_net, ifindex);
|
||||
if (dev)
|
||||
return dev->name;
|
||||
strcpy(result, dev->name);
|
||||
else
|
||||
strcpy(result, "???");
|
||||
read_unlock(&dev_base_lock);
|
||||
|
||||
return "???";
|
||||
return result;
|
||||
}
|
||||
|
||||
static int bcm_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char ifname[IFNAMSIZ];
|
||||
struct sock *sk = (struct sock *)m->private;
|
||||
struct bcm_sock *bo = bcm_sk(sk);
|
||||
struct bcm_op *op;
|
||||
|
@ -157,7 +161,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
|||
seq_printf(m, " / sk %p", sk);
|
||||
seq_printf(m, " / bo %p", bo);
|
||||
seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs);
|
||||
seq_printf(m, " / bound %s", bcm_proc_getifname(bo->ifindex));
|
||||
seq_printf(m, " / bound %s", bcm_proc_getifname(ifname, bo->ifindex));
|
||||
seq_printf(m, " <<<\n");
|
||||
|
||||
list_for_each_entry(op, &bo->rx_ops, list) {
|
||||
|
@ -169,7 +173,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
|||
continue;
|
||||
|
||||
seq_printf(m, "rx_op: %03X %-5s ",
|
||||
op->can_id, bcm_proc_getifname(op->ifindex));
|
||||
op->can_id, bcm_proc_getifname(ifname, op->ifindex));
|
||||
seq_printf(m, "[%d]%c ", op->nframes,
|
||||
(op->flags & RX_CHECK_DLC)?'d':' ');
|
||||
if (op->kt_ival1.tv64)
|
||||
|
@ -194,7 +198,8 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
|||
list_for_each_entry(op, &bo->tx_ops, list) {
|
||||
|
||||
seq_printf(m, "tx_op: %03X %s [%d] ",
|
||||
op->can_id, bcm_proc_getifname(op->ifindex),
|
||||
op->can_id,
|
||||
bcm_proc_getifname(ifname, op->ifindex),
|
||||
op->nframes);
|
||||
|
||||
if (op->kt_ival1.tv64)
|
||||
|
|
|
@ -446,25 +446,27 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
goto tx_error;
|
||||
}
|
||||
|
||||
if (tiph->frag_off)
|
||||
df |= old_iph->frag_off & htons(IP_DF);
|
||||
|
||||
if (df) {
|
||||
mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
|
||||
else
|
||||
mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
|
||||
|
||||
if (mtu < 68) {
|
||||
stats->collisions++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
if (mtu < 68) {
|
||||
stats->collisions++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
|
||||
df |= (old_iph->frag_off&htons(IP_DF));
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
|
||||
if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) {
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
if ((old_iph->frag_off & htons(IP_DF)) &&
|
||||
mtu < ntohs(old_iph->tot_len)) {
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
|
||||
htonl(mtu));
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
}
|
||||
|
||||
if (tunnel->err_count > 0) {
|
||||
|
|
|
@ -103,7 +103,7 @@ static int count_them(struct xt_connlimit_data *data,
|
|||
const struct nf_conntrack_tuple *tuple,
|
||||
const union nf_inet_addr *addr,
|
||||
const union nf_inet_addr *mask,
|
||||
const struct xt_match *match)
|
||||
u_int8_t family)
|
||||
{
|
||||
const struct nf_conntrack_tuple_hash *found;
|
||||
struct xt_connlimit_conn *conn;
|
||||
|
@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data,
|
|||
bool addit = true;
|
||||
int matches = 0;
|
||||
|
||||
|
||||
if (match->family == NFPROTO_IPV6)
|
||||
if (family == NFPROTO_IPV6)
|
||||
hash = &data->iphash[connlimit_iphash6(addr, mask)];
|
||||
else
|
||||
hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)];
|
||||
|
@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (same_source_net(addr, mask, &conn->tuple.src.u3,
|
||||
match->family))
|
||||
if (same_source_net(addr, mask, &conn->tuple.src.u3, family))
|
||||
/* same source network -> be counted! */
|
||||
++matches;
|
||||
nf_ct_put(found_ct);
|
||||
|
@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
|
||||
spin_lock_bh(&info->data->lock);
|
||||
connections = count_them(info->data, tuple_ptr, &addr,
|
||||
&info->mask, par->match);
|
||||
&info->mask, par->family);
|
||||
spin_unlock_bh(&info->data->lock);
|
||||
|
||||
if (connections < 0) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user