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:
David S. Miller 2009-11-08 23:00:54 -08:00
commit d0e1e88d6e
23 changed files with 259 additions and 145 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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,
}; };

View file

@ -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];

View file

@ -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;
} }

View file

@ -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");

View file

@ -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);

View file

@ -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);

View file

@ -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),

View file

@ -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

View file

@ -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

View file

@ -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) {

View file

@ -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,

View file

@ -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);

View file

@ -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:

View file

@ -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)

View file

@ -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))

View file

@ -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 */

View file

@ -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)

View file

@ -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) {

View file

@ -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) {