mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
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
23 changed files with 259 additions and 145 deletions
|
@ -477,62 +477,62 @@ static void
|
||||||
modem_set_init(struct IsdnCardState *cs) {
|
modem_set_init(struct IsdnCardState *cs) {
|
||||||
int timeout;
|
int timeout;
|
||||||
|
|
||||||
#define RCV_DELAY 20000
|
#define RCV_DELAY 20
|
||||||
modem_write_cmd(cs, MInit_1, strlen(MInit_1));
|
modem_write_cmd(cs, MInit_1, strlen(MInit_1));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_2, strlen(MInit_2));
|
modem_write_cmd(cs, MInit_2, strlen(MInit_2));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_3, strlen(MInit_3));
|
modem_write_cmd(cs, MInit_3, strlen(MInit_3));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_4, strlen(MInit_4));
|
modem_write_cmd(cs, MInit_4, strlen(MInit_4));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY );
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_5, strlen(MInit_5));
|
modem_write_cmd(cs, MInit_5, strlen(MInit_5));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_6, strlen(MInit_6));
|
modem_write_cmd(cs, MInit_6, strlen(MInit_6));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
modem_write_cmd(cs, MInit_7, strlen(MInit_7));
|
modem_write_cmd(cs, MInit_7, strlen(MInit_7));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
||||||
int timeout;
|
int timeout;
|
||||||
#define RCV_DELAY 20000
|
#define RCV_DELAY 20
|
||||||
|
|
||||||
modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
|
modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
if (outgoing)
|
if (outgoing)
|
||||||
modem_write_cmd(cs, MInit_dialout, strlen(MInit_dialout));
|
modem_write_cmd(cs, MInit_dialout, strlen(MInit_dialout));
|
||||||
else
|
else
|
||||||
|
@ -541,7 +541,7 @@ modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
||||||
while(timeout-- && cs->hw.elsa.transcnt)
|
while(timeout-- && cs->hw.elsa.transcnt)
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
debugl1(cs, "msi tout=%d", timeout);
|
debugl1(cs, "msi tout=%d", timeout);
|
||||||
udelay(RCV_DELAY);
|
mdelay(RCV_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -269,6 +269,8 @@ struct be_adapter {
|
||||||
u32 port_num;
|
u32 port_num;
|
||||||
bool promiscuous;
|
bool promiscuous;
|
||||||
u32 cap;
|
u32 cap;
|
||||||
|
u32 rx_fc; /* Rx flow control */
|
||||||
|
u32 tx_fc; /* Tx flow control */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct ethtool_ops be_ethtool_ops;
|
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)
|
if (ecmd->autoneg != 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
adapter->tx_fc = ecmd->tx_pause;
|
||||||
|
adapter->rx_fc = ecmd->rx_pause;
|
||||||
|
|
||||||
status = be_cmd_set_flow_control(adapter, ecmd->tx_pause,
|
status = be_cmd_set_flow_control(adapter,
|
||||||
ecmd->rx_pause);
|
adapter->tx_fc, adapter->rx_fc);
|
||||||
if (!status)
|
if (status)
|
||||||
dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
|
dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
|
||||||
|
|
||||||
return status;
|
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,
|
status = be_cmd_link_status_query(adapter, &link_up, &mac_speed,
|
||||||
&link_speed);
|
&link_speed);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
goto ret_sts;
|
||||||
be_link_status_update(adapter, link_up);
|
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));
|
schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
|
||||||
return 0;
|
ret_sts:
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int be_setup(struct be_adapter *adapter)
|
static int be_setup(struct be_adapter *adapter)
|
||||||
|
@ -1649,17 +1659,8 @@ static int be_setup(struct be_adapter *adapter)
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
goto rx_qs_destroy;
|
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;
|
return 0;
|
||||||
|
|
||||||
mccqs_destroy:
|
|
||||||
be_mcc_queues_destroy(adapter);
|
|
||||||
rx_qs_destroy:
|
rx_qs_destroy:
|
||||||
be_rx_queues_destroy(adapter);
|
be_rx_queues_destroy(adapter);
|
||||||
tx_qs_destroy:
|
tx_qs_destroy:
|
||||||
|
@ -1910,6 +1911,10 @@ static void be_netdev_init(struct net_device *netdev)
|
||||||
|
|
||||||
adapter->rx_csum = true;
|
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);
|
netif_set_gso_max_size(netdev, 65535);
|
||||||
|
|
||||||
BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
|
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);
|
be_close(netdev);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc);
|
||||||
be_clear(adapter);
|
be_clear(adapter);
|
||||||
|
|
||||||
pci_save_state(pdev);
|
pci_save_state(pdev);
|
||||||
|
|
|
@ -637,6 +637,22 @@ static int can_changelink(struct net_device *dev,
|
||||||
return 0;
|
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)
|
static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct can_priv *priv = netdev_priv(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,
|
.setup = can_setup,
|
||||||
.newlink = can_newlink,
|
.newlink = can_newlink,
|
||||||
.changelink = can_changelink,
|
.changelink = can_changelink,
|
||||||
|
.get_size = can_get_size,
|
||||||
.fill_info = can_fill_info,
|
.fill_info = can_fill_info,
|
||||||
.fill_xstats = can_fill_xstats,
|
.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)
|
if (skb == NULL)
|
||||||
return;
|
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);
|
cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8);
|
||||||
|
|
||||||
if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME
|
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;
|
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++) {
|
for (i = 0; i < MAX_TX_URBS; i++) {
|
||||||
if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) {
|
if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) {
|
||||||
context = &dev->tx_contexts[i];
|
context = &dev->tx_contexts[i];
|
||||||
|
|
|
@ -4342,11 +4342,11 @@ static int cas_open(struct net_device *dev)
|
||||||
cas_unlock_all_restore(cp, flags);
|
cas_unlock_all_restore(cp, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = -ENOMEM;
|
||||||
if (cas_tx_tiny_alloc(cp) < 0)
|
if (cas_tx_tiny_alloc(cp) < 0)
|
||||||
return -ENOMEM;
|
goto err_unlock;
|
||||||
|
|
||||||
/* alloc rx descriptors */
|
/* alloc rx descriptors */
|
||||||
err = -ENOMEM;
|
|
||||||
if (cas_alloc_rxds(cp) < 0)
|
if (cas_alloc_rxds(cp) < 0)
|
||||||
goto err_tx_tiny;
|
goto err_tx_tiny;
|
||||||
|
|
||||||
|
@ -4386,6 +4386,7 @@ err_spare:
|
||||||
cas_free_rxds(cp);
|
cas_free_rxds(cp);
|
||||||
err_tx_tiny:
|
err_tx_tiny:
|
||||||
cas_tx_tiny_free(cp);
|
cas_tx_tiny_free(cp);
|
||||||
|
err_unlock:
|
||||||
mutex_unlock(&cp->pm_mutex);
|
mutex_unlock(&cp->pm_mutex);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -462,3 +462,4 @@ void fsl_pq_mdio_exit(void)
|
||||||
of_unregister_platform_driver(&fsl_pq_mdio_driver);
|
of_unregister_platform_driver(&fsl_pq_mdio_driver);
|
||||||
}
|
}
|
||||||
module_exit(fsl_pq_mdio_exit);
|
module_exit(fsl_pq_mdio_exit);
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
#include "ixgbe.h"
|
#include "ixgbe.h"
|
||||||
#include "ixgbe_common.h"
|
#include "ixgbe_common.h"
|
||||||
|
#include "ixgbe_dcb_82599.h"
|
||||||
|
|
||||||
char ixgbe_driver_name[] = "ixgbe";
|
char ixgbe_driver_name[] = "ixgbe";
|
||||||
static const char ixgbe_driver_string[] =
|
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 */
|
/* 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,
|
static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
||||||
struct ixgbe_ring *tx_ring,
|
struct ixgbe_ring *tx_ring,
|
||||||
unsigned int eop)
|
unsigned int eop)
|
||||||
|
@ -239,7 +290,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
||||||
adapter->detect_tx_hung = false;
|
adapter->detect_tx_hung = false;
|
||||||
if (tx_ring->tx_buffer_info[eop].time_stamp &&
|
if (tx_ring->tx_buffer_info[eop].time_stamp &&
|
||||||
time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) &&
|
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 */
|
/* detected Tx unit hang */
|
||||||
union ixgbe_adv_tx_desc *tx_desc;
|
union ixgbe_adv_tx_desc *tx_desc;
|
||||||
tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
|
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;
|
u32 txctrl;
|
||||||
int cpu = get_cpu();
|
int cpu = get_cpu();
|
||||||
int q = tx_ring - adapter->tx_ring;
|
int q = tx_ring - adapter->tx_ring;
|
||||||
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
if (tx_ring->cpu != cpu) {
|
if (tx_ring->cpu != cpu) {
|
||||||
txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q));
|
|
||||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||||
|
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q));
|
||||||
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK;
|
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK;
|
||||||
txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu);
|
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) {
|
} 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 &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599;
|
||||||
txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) <<
|
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;
|
tx_ring->cpu = cpu;
|
||||||
}
|
}
|
||||||
put_cpu();
|
put_cpu();
|
||||||
|
@ -1908,11 +1963,25 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hw->mac.type == ixgbe_mac_82599EB) {
|
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 */
|
/* We enable 8 traffic classes, DCB only */
|
||||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA |
|
IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA |
|
||||||
IXGBE_MTQC_8TC_8TQ));
|
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);
|
ixgbe_restore_vlan(adapter);
|
||||||
#ifdef CONFIG_IXGBE_DCB
|
#ifdef CONFIG_IXGBE_DCB
|
||||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
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);
|
ixgbe_configure_dcb(adapter);
|
||||||
} else {
|
} else {
|
||||||
netif_set_gso_max_size(netdev, 65536);
|
netif_set_gso_max_size(netdev, 65536);
|
||||||
|
|
|
@ -223,69 +223,73 @@ static int __devinit macsonic_init(struct net_device *dev)
|
||||||
return 0;
|
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);
|
struct sonic_local *lp = netdev_priv(dev);
|
||||||
const int prom_addr = ONBOARD_SONIC_PROM_BASE;
|
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. */
|
* On NuBus boards we can sometimes look in the ROM resources.
|
||||||
for(i = 0; i < 6; i++)
|
* No such luck for comm-slot/onboard.
|
||||||
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
* 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
|
for (i = 0; i < 6; i++)
|
||||||
source has a rather long and detailed historical account of
|
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
||||||
why this is so. */
|
if (!INVALID_MAC(dev->dev_addr))
|
||||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
return;
|
||||||
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;
|
|
||||||
|
|
||||||
/* 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");
|
bit_reverse_addr(dev->dev_addr);
|
||||||
return -EIO;
|
if (!INVALID_MAC(dev->dev_addr))
|
||||||
} else return 0;
|
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)
|
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);
|
SONIC_WRITE(SONIC_ISR, 0x7fff);
|
||||||
|
|
||||||
/* Now look for the MAC address. */
|
/* Now look for the MAC address. */
|
||||||
if (mac_onboard_sonic_ethernet_addr(dev) != 0)
|
mac_onboard_sonic_ethernet_addr(dev);
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
/* Shared init code */
|
/* Shared init code */
|
||||||
return macsonic_init(dev);
|
return macsonic_init(dev);
|
||||||
|
|
|
@ -4145,6 +4145,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set PCIe reset type for EEH to fundamental. */
|
||||||
|
pdev->needs_freset = 1;
|
||||||
pci_save_state(pdev);
|
pci_save_state(pdev);
|
||||||
qdev->reg_base =
|
qdev->reg_base =
|
||||||
ioremap_nocache(pci_resource_start(pdev, 1),
|
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. */
|
/* Wait for the interrupt to come in. */
|
||||||
status = ql_wait_mbx_cmd_cmplt(qdev);
|
status = ql_wait_mbx_cmd_cmplt(qdev);
|
||||||
if (status)
|
if (status)
|
||||||
goto end;
|
continue;
|
||||||
|
|
||||||
/* Process the event. If it's an AEN, it
|
/* Process the event. If it's an AEN, it
|
||||||
* will be handled in-line or a worker
|
* will be handled in-line or a worker
|
||||||
|
|
|
@ -6325,10 +6325,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (dev) {
|
if (dev) {
|
||||||
if (registered) {
|
if (registered)
|
||||||
unregister_ieee80211(priv->ieee);
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
}
|
|
||||||
|
|
||||||
ipw2100_hw_stop_adapter(priv);
|
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()
|
/* Unregister the device first - this results in close()
|
||||||
* being called if the device is open. If we free storage
|
* being called if the device is open. If we free storage
|
||||||
* first, then close() will crash. */
|
* first, then close() will crash. */
|
||||||
unregister_ieee80211(priv->ieee);
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
|
||||||
/* ipw2100_down will ensure that there is no more pending work
|
/* 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) {
|
if (err) {
|
||||||
IPW_ERROR("Failed to register promiscuous network "
|
IPW_ERROR("Failed to register promiscuous network "
|
||||||
"device (error %d).\n", err);
|
"device (error %d).\n", err);
|
||||||
unregister_ieee80211(priv->ieee);
|
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
goto out_remove_sysfs;
|
goto out_remove_sysfs;
|
||||||
}
|
}
|
||||||
|
@ -11873,7 +11872,6 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev)
|
||||||
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
unregister_ieee80211(priv->ieee);
|
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
|
|
||||||
if (priv->rxq) {
|
if (priv->rxq) {
|
||||||
|
|
|
@ -1020,7 +1020,6 @@ static inline int libipw_is_cck_rate(u8 rate)
|
||||||
/* ieee80211.c */
|
/* ieee80211.c */
|
||||||
extern void free_ieee80211(struct net_device *dev, int monitor);
|
extern void free_ieee80211(struct net_device *dev, int monitor);
|
||||||
extern struct net_device *alloc_ieee80211(int sizeof_priv, 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 int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
||||||
|
|
||||||
extern void libipw_networks_age(struct libipw_device *ieee,
|
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);
|
libipw_networks_free(ieee);
|
||||||
|
|
||||||
/* free cfg80211 resources */
|
/* 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);
|
wiphy_free(ieee->wdev.wiphy);
|
||||||
|
}
|
||||||
|
|
||||||
free_netdev(dev);
|
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
|
#ifdef CONFIG_LIBIPW_DEBUG
|
||||||
|
|
||||||
static int debug = 0;
|
static int debug = 0;
|
||||||
|
@ -333,4 +330,3 @@ module_init(libipw_init);
|
||||||
|
|
||||||
EXPORT_SYMBOL(alloc_ieee80211);
|
EXPORT_SYMBOL(alloc_ieee80211);
|
||||||
EXPORT_SYMBOL(free_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);
|
mutex_init(&rt2x00dev->csr_mutex);
|
||||||
|
|
||||||
|
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make room for rt2x00_intf inside the per-interface
|
* Make room for rt2x00_intf inside the per-interface
|
||||||
* structure ieee80211_vif.
|
* structure ieee80211_vif.
|
||||||
|
@ -871,8 +873,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||||
rt2x00leds_register(rt2x00dev);
|
rt2x00leds_register(rt2x00dev);
|
||||||
rt2x00debug_register(rt2x00dev);
|
rt2x00debug_register(rt2x00dev);
|
||||||
|
|
||||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
|
@ -362,8 +362,9 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
||||||
rt2x00link_reset_tuner(rt2x00dev, false);
|
rt2x00link_reset_tuner(rt2x00dev, false);
|
||||||
|
|
||||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||||
&link->work, LINK_TUNE_INTERVAL);
|
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||||
|
&link->work, LINK_TUNE_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
|
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.
|
* Increase tuner counter, and reschedule the next link tuner run.
|
||||||
*/
|
*/
|
||||||
link->count++;
|
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)
|
void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
|
@ -47,6 +47,8 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
||||||
(requesttype == USB_VENDOR_REQUEST_IN) ?
|
(requesttype == USB_VENDOR_REQUEST_IN) ?
|
||||||
usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
|
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++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
status = usb_control_msg(usb_dev, pipe, request, requesttype,
|
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.
|
* -ENODEV: Device has disappeared, no point continuing.
|
||||||
* All other errors: Try again.
|
* All other errors: Try again.
|
||||||
*/
|
*/
|
||||||
else if (status == -ENODEV)
|
else if (status == -ENODEV) {
|
||||||
|
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ERROR(rt2x00dev,
|
ERROR(rt2x00dev,
|
||||||
|
@ -161,6 +165,9 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
rt2x00usb_register_read_lock(rt2x00dev, offset, reg);
|
rt2x00usb_register_read_lock(rt2x00dev, offset, reg);
|
||||||
if (!rt2x00_get_field32(*reg, field))
|
if (!rt2x00_get_field32(*reg, field))
|
||||||
|
|
|
@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
|
||||||
|
|
||||||
/* turn the LED off before exiting */
|
/* turn the LED off before exiting */
|
||||||
ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
|
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_rx);
|
||||||
rtl8187_unregister_led(&priv->led_tx);
|
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 */
|
#endif /* def CONFIG_RTL8187_LED */
|
||||||
|
|
||||||
|
|
|
@ -132,23 +132,27 @@ static inline struct bcm_sock *bcm_sk(const struct sock *sk)
|
||||||
/*
|
/*
|
||||||
* procfs functions
|
* procfs functions
|
||||||
*/
|
*/
|
||||||
static char *bcm_proc_getifname(int ifindex)
|
static char *bcm_proc_getifname(char *result, int ifindex)
|
||||||
{
|
{
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
if (!ifindex)
|
if (!ifindex)
|
||||||
return "any";
|
return "any";
|
||||||
|
|
||||||
/* no usage counting */
|
read_lock(&dev_base_lock);
|
||||||
dev = __dev_get_by_index(&init_net, ifindex);
|
dev = __dev_get_by_index(&init_net, ifindex);
|
||||||
if (dev)
|
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)
|
static int bcm_proc_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
|
char ifname[IFNAMSIZ];
|
||||||
struct sock *sk = (struct sock *)m->private;
|
struct sock *sk = (struct sock *)m->private;
|
||||||
struct bcm_sock *bo = bcm_sk(sk);
|
struct bcm_sock *bo = bcm_sk(sk);
|
||||||
struct bcm_op *op;
|
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, " / sk %p", sk);
|
||||||
seq_printf(m, " / bo %p", bo);
|
seq_printf(m, " / bo %p", bo);
|
||||||
seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs);
|
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");
|
seq_printf(m, " <<<\n");
|
||||||
|
|
||||||
list_for_each_entry(op, &bo->rx_ops, list) {
|
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;
|
continue;
|
||||||
|
|
||||||
seq_printf(m, "rx_op: %03X %-5s ",
|
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,
|
seq_printf(m, "[%d]%c ", op->nframes,
|
||||||
(op->flags & RX_CHECK_DLC)?'d':' ');
|
(op->flags & RX_CHECK_DLC)?'d':' ');
|
||||||
if (op->kt_ival1.tv64)
|
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) {
|
list_for_each_entry(op, &bo->tx_ops, list) {
|
||||||
|
|
||||||
seq_printf(m, "tx_op: %03X %s [%d] ",
|
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);
|
op->nframes);
|
||||||
|
|
||||||
if (op->kt_ival1.tv64)
|
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;
|
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);
|
mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
|
||||||
else
|
|
||||||
mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
|
|
||||||
|
|
||||||
if (mtu < 68) {
|
if (mtu < 68) {
|
||||||
stats->collisions++;
|
stats->collisions++;
|
||||||
ip_rt_put(rt);
|
ip_rt_put(rt);
|
||||||
goto tx_error;
|
goto tx_error;
|
||||||
}
|
}
|
||||||
if (skb_dst(skb))
|
|
||||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
|
||||||
|
|
||||||
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)) {
|
if ((old_iph->frag_off & htons(IP_DF)) &&
|
||||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
mtu < ntohs(old_iph->tot_len)) {
|
||||||
ip_rt_put(rt);
|
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
|
||||||
goto tx_error;
|
htonl(mtu));
|
||||||
|
ip_rt_put(rt);
|
||||||
|
goto tx_error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tunnel->err_count > 0) {
|
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 struct nf_conntrack_tuple *tuple,
|
||||||
const union nf_inet_addr *addr,
|
const union nf_inet_addr *addr,
|
||||||
const union nf_inet_addr *mask,
|
const union nf_inet_addr *mask,
|
||||||
const struct xt_match *match)
|
u_int8_t family)
|
||||||
{
|
{
|
||||||
const struct nf_conntrack_tuple_hash *found;
|
const struct nf_conntrack_tuple_hash *found;
|
||||||
struct xt_connlimit_conn *conn;
|
struct xt_connlimit_conn *conn;
|
||||||
|
@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data,
|
||||||
bool addit = true;
|
bool addit = true;
|
||||||
int matches = 0;
|
int matches = 0;
|
||||||
|
|
||||||
|
if (family == NFPROTO_IPV6)
|
||||||
if (match->family == NFPROTO_IPV6)
|
|
||||||
hash = &data->iphash[connlimit_iphash6(addr, mask)];
|
hash = &data->iphash[connlimit_iphash6(addr, mask)];
|
||||||
else
|
else
|
||||||
hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)];
|
hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)];
|
||||||
|
@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (same_source_net(addr, mask, &conn->tuple.src.u3,
|
if (same_source_net(addr, mask, &conn->tuple.src.u3, family))
|
||||||
match->family))
|
|
||||||
/* same source network -> be counted! */
|
/* same source network -> be counted! */
|
||||||
++matches;
|
++matches;
|
||||||
nf_ct_put(found_ct);
|
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);
|
spin_lock_bh(&info->data->lock);
|
||||||
connections = count_them(info->data, tuple_ptr, &addr,
|
connections = count_them(info->data, tuple_ptr, &addr,
|
||||||
&info->mask, par->match);
|
&info->mask, par->family);
|
||||||
spin_unlock_bh(&info->data->lock);
|
spin_unlock_bh(&info->data->lock);
|
||||||
|
|
||||||
if (connections < 0) {
|
if (connections < 0) {
|
||||||
|
|
Loading…
Reference in a new issue