mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (47 commits) sysctl: net: call unregister_net_sysctl_table where needed Revert: veth: remove unneeded ifname code from veth_newlink() smsc95xx: fix reset check tg3: Fix failure to enable WoL by default when possible networking: inappropriate ioctl operation should return ENOTTY amd8111e: trivial typo spelling: Negotitate -> Negotiate ipv4: don't spam dmesg with "Using LC-trie" messages af_unix: Only allow recv on connected seqpacket sockets. mii: add support of pause frames in mii_get_an net: ftmac100: fix scheduling while atomic during PHY link status change usbnet: Transfer of maintainership usbnet: add support for some Huawei modems with cdc-ether ports bnx2: cancel timer on device removal iwl4965: fix "Received BA when not expected" iwlagn: fix "Received BA when not expected" dsa/mv88e6131: fix unknown multicast/broadcast forwarding on mv88e6085 usbnet: Resubmit interrupt URB if device is open iwl4965: fix "TX Power requested while scanning" iwlegacy: led stay solid on when no traffic b43: trivial: update module info about ucode16_mimo firmware ...
This commit is contained in:
commit
5933f2ae35
@ -6556,7 +6556,7 @@ S: Maintained
|
||||
F: drivers/usb/host/uhci*
|
||||
|
||||
USB "USBNET" DRIVER FRAMEWORK
|
||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||
M: Oliver Neukum <oneukum@suse.de>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
@ -393,8 +393,8 @@ typedef struct fec {
|
||||
uint fec_addr_low; /* lower 32 bits of station address */
|
||||
ushort fec_addr_high; /* upper 16 bits of station address */
|
||||
ushort res1; /* reserved */
|
||||
uint fec_hash_table_high; /* upper 32-bits of hash table */
|
||||
uint fec_hash_table_low; /* lower 32-bits of hash table */
|
||||
uint fec_grp_hash_table_high; /* upper 32-bits of hash table */
|
||||
uint fec_grp_hash_table_low; /* lower 32-bits of hash table */
|
||||
uint fec_r_des_start; /* beginning of Rx descriptor ring */
|
||||
uint fec_x_des_start; /* beginning of Tx descriptor ring */
|
||||
uint fec_r_buff_size; /* Rx buffer size */
|
||||
|
@ -106,7 +106,7 @@ MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "M
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
||||
module_param_array(speed_duplex, int, NULL, 0);
|
||||
MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotitate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex");
|
||||
MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotiate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex");
|
||||
module_param_array(coalesce, bool, NULL, 0);
|
||||
MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable");
|
||||
module_param_array(dynamic_ipg, bool, NULL, 0);
|
||||
|
@ -566,9 +566,9 @@ struct atl1c_adapter {
|
||||
#define __AT_TESTING 0x0001
|
||||
#define __AT_RESETTING 0x0002
|
||||
#define __AT_DOWN 0x0003
|
||||
u8 work_event;
|
||||
#define ATL1C_WORK_EVENT_RESET 0x01
|
||||
#define ATL1C_WORK_EVENT_LINK_CHANGE 0x02
|
||||
unsigned long work_event;
|
||||
#define ATL1C_WORK_EVENT_RESET 0
|
||||
#define ATL1C_WORK_EVENT_LINK_CHANGE 1
|
||||
u32 msg_enable;
|
||||
|
||||
bool have_msi;
|
||||
|
@ -325,7 +325,7 @@ static void atl1c_link_chg_event(struct atl1c_adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE;
|
||||
set_bit(ATL1C_WORK_EVENT_LINK_CHANGE, &adapter->work_event);
|
||||
schedule_work(&adapter->common_task);
|
||||
}
|
||||
|
||||
@ -337,20 +337,16 @@ static void atl1c_common_task(struct work_struct *work)
|
||||
adapter = container_of(work, struct atl1c_adapter, common_task);
|
||||
netdev = adapter->netdev;
|
||||
|
||||
if (adapter->work_event & ATL1C_WORK_EVENT_RESET) {
|
||||
adapter->work_event &= ~ATL1C_WORK_EVENT_RESET;
|
||||
if (test_and_clear_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event)) {
|
||||
netif_device_detach(netdev);
|
||||
atl1c_down(adapter);
|
||||
atl1c_up(adapter);
|
||||
netif_device_attach(netdev);
|
||||
return;
|
||||
}
|
||||
|
||||
if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE) {
|
||||
adapter->work_event &= ~ATL1C_WORK_EVENT_LINK_CHANGE;
|
||||
if (test_and_clear_bit(ATL1C_WORK_EVENT_LINK_CHANGE,
|
||||
&adapter->work_event))
|
||||
atl1c_check_link_status(adapter);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -369,7 +365,7 @@ static void atl1c_tx_timeout(struct net_device *netdev)
|
||||
struct atl1c_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* Do the reset outside of interrupt context */
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_RESET;
|
||||
set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event);
|
||||
schedule_work(&adapter->common_task);
|
||||
}
|
||||
|
||||
|
@ -1873,6 +1873,7 @@ static void be_worker(struct work_struct *work)
|
||||
be_detect_dump_ue(adapter);
|
||||
|
||||
reschedule:
|
||||
adapter->work_counter++;
|
||||
schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
|
||||
}
|
||||
|
||||
|
@ -8413,6 +8413,8 @@ bnx2_remove_one(struct pci_dev *pdev)
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
||||
del_timer_sync(&bp->timer);
|
||||
|
||||
if (bp->mips_firmware)
|
||||
release_firmware(bp->mips_firmware);
|
||||
if (bp->rv2p_firmware)
|
||||
|
@ -2019,15 +2019,23 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
|
||||
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
|
||||
u32 *parsing_data, u32 xmit_type)
|
||||
{
|
||||
*parsing_data |= ((tcp_hdrlen(skb)/4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||
*parsing_data |=
|
||||
((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||
|
||||
*parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||
if (xmit_type & XMIT_CSUM_TCP) {
|
||||
*parsing_data |= ((tcp_hdrlen(skb) / 4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||
|
||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||
} else
|
||||
/* We support checksum offload for TCP and UDP only.
|
||||
* No need to pass the UDP header length - it's a constant.
|
||||
*/
|
||||
return skb_transport_header(skb) +
|
||||
sizeof(struct udphdr) - skb->data;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2043,7 +2051,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
|
||||
struct eth_tx_parse_bd_e1x *pbd,
|
||||
u32 xmit_type)
|
||||
{
|
||||
u8 hlen = (skb_network_header(skb) - skb->data) / 2;
|
||||
u8 hlen = (skb_network_header(skb) - skb->data) >> 1;
|
||||
|
||||
/* for now NS flag is not used in Linux */
|
||||
pbd->global_data =
|
||||
@ -2051,9 +2059,15 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
|
||||
ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
|
||||
|
||||
pbd->ip_hlen_w = (skb_transport_header(skb) -
|
||||
skb_network_header(skb)) / 2;
|
||||
skb_network_header(skb)) >> 1;
|
||||
|
||||
hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2;
|
||||
hlen += pbd->ip_hlen_w;
|
||||
|
||||
/* We support checksum offload for TCP and UDP only */
|
||||
if (xmit_type & XMIT_CSUM_TCP)
|
||||
hlen += tcp_hdrlen(skb) / 2;
|
||||
else
|
||||
hlen += sizeof(struct udphdr) / 2;
|
||||
|
||||
pbd->total_hlen_w = cpu_to_le16(hlen);
|
||||
hlen = hlen*2;
|
||||
|
@ -1482,8 +1482,11 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best,
|
||||
|
||||
static int agg_device_up(const struct aggregator *agg)
|
||||
{
|
||||
return (netif_running(agg->slave->dev) &&
|
||||
netif_carrier_ok(agg->slave->dev));
|
||||
struct port *port = agg->lag_ports;
|
||||
if (!port)
|
||||
return 0;
|
||||
return (netif_running(port->slave->dev) &&
|
||||
netif_carrier_ok(port->slave->dev));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3040,11 +3040,14 @@ static void ehea_rereg_mrs(void)
|
||||
|
||||
if (dev->flags & IFF_UP) {
|
||||
mutex_lock(&port->port_lock);
|
||||
port_napi_enable(port);
|
||||
ret = ehea_restart_qps(dev);
|
||||
check_sqs(port);
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
check_sqs(port);
|
||||
port_napi_enable(port);
|
||||
netif_wake_queue(dev);
|
||||
} else {
|
||||
netdev_err(dev, "Unable to restart QPS\n");
|
||||
}
|
||||
mutex_unlock(&port->port_lock);
|
||||
}
|
||||
}
|
||||
|
@ -226,8 +226,8 @@ static void set_multicast_finish(struct net_device *dev)
|
||||
}
|
||||
|
||||
FC(fecp, r_cntrl, FEC_RCNTRL_PROM);
|
||||
FW(fecp, hash_table_high, fep->fec.hthi);
|
||||
FW(fecp, hash_table_low, fep->fec.htlo);
|
||||
FW(fecp, grp_hash_table_high, fep->fec.hthi);
|
||||
FW(fecp, grp_hash_table_low, fep->fec.htlo);
|
||||
}
|
||||
|
||||
static void set_multicast_list(struct net_device *dev)
|
||||
@ -273,8 +273,8 @@ static void restart(struct net_device *dev)
|
||||
/*
|
||||
* Reset all multicast.
|
||||
*/
|
||||
FW(fecp, hash_table_high, fep->fec.hthi);
|
||||
FW(fecp, hash_table_low, fep->fec.htlo);
|
||||
FW(fecp, grp_hash_table_high, fep->fec.hthi);
|
||||
FW(fecp, grp_hash_table_low, fep->fec.htlo);
|
||||
|
||||
/*
|
||||
* Set maximum receive buffer size.
|
||||
|
@ -139,11 +139,11 @@ static int ftmac100_reset(struct ftmac100 *priv)
|
||||
* that hardware reset completed (what the f*ck).
|
||||
* We still need to wait for a while.
|
||||
*/
|
||||
usleep_range(500, 1000);
|
||||
udelay(500);
|
||||
return 0;
|
||||
}
|
||||
|
||||
usleep_range(1000, 10000);
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "software reset failed\n");
|
||||
@ -772,7 +772,7 @@ static int ftmac100_mdio_read(struct net_device *netdev, int phy_id, int reg)
|
||||
if ((phycr & FTMAC100_PHYCR_MIIRD) == 0)
|
||||
return phycr & FTMAC100_PHYCR_MIIRDATA;
|
||||
|
||||
usleep_range(100, 1000);
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "mdio read timed out\n");
|
||||
@ -801,7 +801,7 @@ static void ftmac100_mdio_write(struct net_device *netdev, int phy_id, int reg,
|
||||
if ((phycr & FTMAC100_PHYCR_MIIWR) == 0)
|
||||
return;
|
||||
|
||||
usleep_range(100, 1000);
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
netdev_err(netdev, "mdio write timed out\n");
|
||||
|
@ -49,6 +49,10 @@ static u32 mii_get_an(struct mii_if_info *mii, u16 addr)
|
||||
result |= ADVERTISED_100baseT_Half;
|
||||
if (advert & ADVERTISE_100FULL)
|
||||
result |= ADVERTISED_100baseT_Full;
|
||||
if (advert & ADVERTISE_PAUSE_CAP)
|
||||
result |= ADVERTISED_Pause;
|
||||
if (advert & ADVERTISE_PAUSE_ASYM)
|
||||
result |= ADVERTISED_Asym_Pause;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this,
|
||||
goto done;
|
||||
|
||||
spin_lock_irqsave(&target_list_lock, flags);
|
||||
restart:
|
||||
list_for_each_entry(nt, &target_list, list) {
|
||||
netconsole_target_get(nt);
|
||||
if (nt->np.dev == dev) {
|
||||
@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this,
|
||||
* rtnl_lock already held
|
||||
*/
|
||||
if (nt->np.dev) {
|
||||
spin_unlock_irqrestore(
|
||||
&target_list_lock,
|
||||
flags);
|
||||
__netpoll_cleanup(&nt->np);
|
||||
spin_lock_irqsave(&target_list_lock,
|
||||
flags);
|
||||
dev_put(nt->np.dev);
|
||||
nt->np.dev = NULL;
|
||||
netconsole_target_put(nt);
|
||||
goto restart;
|
||||
}
|
||||
/* Fall through */
|
||||
case NETDEV_GOING_DOWN:
|
||||
|
@ -170,6 +170,16 @@ static const struct {
|
||||
};
|
||||
#undef _R
|
||||
|
||||
static const struct rtl_firmware_info {
|
||||
int mac_version;
|
||||
const char *fw_name;
|
||||
} rtl_firmware_infos[] = {
|
||||
{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 },
|
||||
{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 },
|
||||
{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 },
|
||||
{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 }
|
||||
};
|
||||
|
||||
enum cfg_version {
|
||||
RTL_CFG_0 = 0x00,
|
||||
RTL_CFG_1,
|
||||
@ -565,6 +575,7 @@ struct rtl8169_private {
|
||||
u32 saved_wolopts;
|
||||
|
||||
const struct firmware *fw;
|
||||
#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN);
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
|
||||
@ -1789,25 +1800,26 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
|
||||
|
||||
static void rtl_release_firmware(struct rtl8169_private *tp)
|
||||
{
|
||||
release_firmware(tp->fw);
|
||||
tp->fw = NULL;
|
||||
if (!IS_ERR_OR_NULL(tp->fw))
|
||||
release_firmware(tp->fw);
|
||||
tp->fw = RTL_FIRMWARE_UNKNOWN;
|
||||
}
|
||||
|
||||
static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name)
|
||||
static void rtl_apply_firmware(struct rtl8169_private *tp)
|
||||
{
|
||||
const struct firmware **fw = &tp->fw;
|
||||
int rc = !*fw;
|
||||
|
||||
if (rc) {
|
||||
rc = request_firmware(fw, fw_name, &tp->pci_dev->dev);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
}
|
||||
const struct firmware *fw = tp->fw;
|
||||
|
||||
/* TODO: release firmware once rtl_phy_write_fw signals failures. */
|
||||
rtl_phy_write_fw(tp, *fw);
|
||||
out:
|
||||
return rc;
|
||||
if (!IS_ERR_OR_NULL(fw))
|
||||
rtl_phy_write_fw(tp, fw);
|
||||
}
|
||||
|
||||
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
|
||||
{
|
||||
if (rtl_readphy(tp, reg) != val)
|
||||
netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n");
|
||||
else
|
||||
rtl_apply_firmware(tp);
|
||||
}
|
||||
|
||||
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
|
||||
@ -2246,10 +2258,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0005);
|
||||
rtl_writephy(tp, 0x05, 0x001b);
|
||||
if ((rtl_readphy(tp, 0x06) != 0xbf00) ||
|
||||
(rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) {
|
||||
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
|
||||
}
|
||||
|
||||
rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
}
|
||||
@ -2351,10 +2361,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0005);
|
||||
rtl_writephy(tp, 0x05, 0x001b);
|
||||
if ((rtl_readphy(tp, 0x06) != 0xb300) ||
|
||||
(rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) {
|
||||
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
|
||||
}
|
||||
|
||||
rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
}
|
||||
@ -2474,8 +2482,7 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
|
||||
if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0)
|
||||
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||
}
|
||||
@ -3237,6 +3244,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
tp->timer.data = (unsigned long) dev;
|
||||
tp->timer.function = rtl8169_phy_timer;
|
||||
|
||||
tp->fw = RTL_FIRMWARE_UNKNOWN;
|
||||
|
||||
rc = register_netdev(dev);
|
||||
if (rc < 0)
|
||||
goto err_out_msi_4;
|
||||
@ -3288,10 +3297,10 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
|
||||
|
||||
cancel_delayed_work_sync(&tp->task);
|
||||
|
||||
rtl_release_firmware(tp);
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
||||
rtl_release_firmware(tp);
|
||||
|
||||
if (pci_dev_run_wake(pdev))
|
||||
pm_runtime_get_noresume(&pdev->dev);
|
||||
|
||||
@ -3303,6 +3312,37 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
static void rtl_request_firmware(struct rtl8169_private *tp)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Return early if the firmware is already loaded / cached. */
|
||||
if (!IS_ERR(tp->fw))
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
|
||||
const struct rtl_firmware_info *info = rtl_firmware_infos + i;
|
||||
|
||||
if (info->mac_version == tp->mac_version) {
|
||||
const char *name = info->fw_name;
|
||||
int rc;
|
||||
|
||||
rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev);
|
||||
if (rc < 0) {
|
||||
netif_warn(tp, ifup, tp->dev, "unable to load "
|
||||
"firmware patch %s (%d)\n", name, rc);
|
||||
goto out_disable_request_firmware;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
out_disable_request_firmware:
|
||||
tp->fw = NULL;
|
||||
out:
|
||||
return;
|
||||
}
|
||||
|
||||
static int rtl8169_open(struct net_device *dev)
|
||||
{
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
@ -3334,11 +3374,13 @@ static int rtl8169_open(struct net_device *dev)
|
||||
|
||||
smp_mb();
|
||||
|
||||
rtl_request_firmware(tp);
|
||||
|
||||
retval = request_irq(dev->irq, rtl8169_interrupt,
|
||||
(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
|
||||
dev->name, dev);
|
||||
if (retval < 0)
|
||||
goto err_release_ring_2;
|
||||
goto err_release_fw_2;
|
||||
|
||||
napi_enable(&tp->napi);
|
||||
|
||||
@ -3359,7 +3401,8 @@ static int rtl8169_open(struct net_device *dev)
|
||||
out:
|
||||
return retval;
|
||||
|
||||
err_release_ring_2:
|
||||
err_release_fw_2:
|
||||
rtl_release_firmware(tp);
|
||||
rtl8169_rx_clear(tp);
|
||||
err_free_rx_1:
|
||||
dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
|
||||
|
@ -12327,8 +12327,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||
if (val & VCPU_CFGSHDW_ASPM_DBNC)
|
||||
tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND;
|
||||
if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
|
||||
(val & VCPU_CFGSHDW_WOL_MAGPKT))
|
||||
(val & VCPU_CFGSHDW_WOL_MAGPKT)) {
|
||||
tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
|
||||
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
@ -12461,8 +12463,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||
tp->tg3_flags &= ~TG3_FLAG_WOL_CAP;
|
||||
|
||||
if ((tp->tg3_flags & TG3_FLAG_WOL_CAP) &&
|
||||
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE))
|
||||
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) {
|
||||
tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
|
||||
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||
}
|
||||
|
||||
if (cfg2 & (1 << 17))
|
||||
tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
|
||||
|
@ -460,7 +460,7 @@ static const struct driver_info cdc_info = {
|
||||
.manage_power = cdc_manage_power,
|
||||
};
|
||||
|
||||
static const struct driver_info mbm_info = {
|
||||
static const struct driver_info wwan_info = {
|
||||
.description = "Mobile Broadband Network Device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = usbnet_cdc_bind,
|
||||
@ -471,6 +471,7 @@ static const struct driver_info mbm_info = {
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
|
||||
static const struct usb_device_id products [] = {
|
||||
/*
|
||||
@ -587,8 +588,17 @@ static const struct usb_device_id products [] = {
|
||||
}, {
|
||||
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
||||
USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&mbm_info,
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
|
||||
}, {
|
||||
/* Various Huawei modems with a network port like the UMG1831 */
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = HUAWEI_VENDOR_ID,
|
||||
.bInterfaceClass = USB_CLASS_COMM,
|
||||
.bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET,
|
||||
.bInterfaceProtocol = 255,
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
},
|
||||
{ }, // END
|
||||
};
|
||||
|
@ -54,13 +54,13 @@
|
||||
#include <linux/usb/usbnet.h>
|
||||
#include <linux/usb/cdc.h>
|
||||
|
||||
#define DRIVER_VERSION "7-Feb-2011"
|
||||
#define DRIVER_VERSION "23-Apr-2011"
|
||||
|
||||
/* CDC NCM subclass 3.2.1 */
|
||||
#define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10
|
||||
|
||||
/* Maximum NTB length */
|
||||
#define CDC_NCM_NTB_MAX_SIZE_TX 16384 /* bytes */
|
||||
#define CDC_NCM_NTB_MAX_SIZE_TX (16384 + 4) /* bytes, must be short terminated */
|
||||
#define CDC_NCM_NTB_MAX_SIZE_RX 16384 /* bytes */
|
||||
|
||||
/* Minimum value for MaxDatagramSize, ch. 6.2.9 */
|
||||
|
@ -730,7 +730,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev)
|
||||
msleep(10);
|
||||
bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
|
||||
timeout++;
|
||||
} while ((bmcr & MII_BMCR) && (timeout < 100));
|
||||
} while ((bmcr & BMCR_RESET) && (timeout < 100));
|
||||
|
||||
if (timeout >= 100) {
|
||||
netdev_warn(dev->net, "timeout on PHY Reset");
|
||||
|
@ -736,6 +736,7 @@ int usbnet_open (struct net_device *net)
|
||||
}
|
||||
}
|
||||
|
||||
set_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||
netif_start_queue (net);
|
||||
netif_info(dev, ifup, dev->net,
|
||||
"open: enable queueing (rx %d, tx %d) mtu %d %s framing\n",
|
||||
@ -1259,6 +1260,9 @@ void usbnet_disconnect (struct usb_interface *intf)
|
||||
if (dev->driver_info->unbind)
|
||||
dev->driver_info->unbind (dev, intf);
|
||||
|
||||
usb_kill_urb(dev->interrupt);
|
||||
usb_free_urb(dev->interrupt);
|
||||
|
||||
free_netdev(net);
|
||||
usb_put_dev (xdev);
|
||||
}
|
||||
@ -1498,6 +1502,10 @@ int usbnet_resume (struct usb_interface *intf)
|
||||
int retval;
|
||||
|
||||
if (!--dev->suspend_count) {
|
||||
/* resume interrupt URBs */
|
||||
if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags))
|
||||
usb_submit_urb(dev->interrupt, GFP_NOIO);
|
||||
|
||||
spin_lock_irq(&dev->txq.lock);
|
||||
while ((res = usb_get_from_anchor(&dev->deferred))) {
|
||||
|
||||
|
@ -403,6 +403,17 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||
if (tb[IFLA_ADDRESS] == NULL)
|
||||
random_ether_addr(dev->dev_addr);
|
||||
|
||||
if (tb[IFLA_IFNAME])
|
||||
nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ);
|
||||
else
|
||||
snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d");
|
||||
|
||||
if (strchr(dev->name, '%')) {
|
||||
err = dev_alloc_name(dev, dev->name);
|
||||
if (err < 0)
|
||||
goto err_alloc_name;
|
||||
}
|
||||
|
||||
err = register_netdevice(dev);
|
||||
if (err < 0)
|
||||
goto err_register_dev;
|
||||
@ -422,6 +433,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||
|
||||
err_register_dev:
|
||||
/* nothing to do */
|
||||
err_alloc_name:
|
||||
err_configure_peer:
|
||||
unregister_netdevice(peer);
|
||||
return err;
|
||||
|
@ -506,7 +506,7 @@ bool ath_stoprecv(struct ath_softc *sc)
|
||||
"confusing the DMA engine when we start RX up\n");
|
||||
ATH_DBG_WARN_ON_ONCE(!stopped);
|
||||
}
|
||||
return stopped || reset;
|
||||
return stopped && !reset;
|
||||
}
|
||||
|
||||
void ath_flushrecv(struct ath_softc *sc)
|
||||
|
@ -72,6 +72,7 @@ MODULE_FIRMWARE("b43/ucode11.fw");
|
||||
MODULE_FIRMWARE("b43/ucode13.fw");
|
||||
MODULE_FIRMWARE("b43/ucode14.fw");
|
||||
MODULE_FIRMWARE("b43/ucode15.fw");
|
||||
MODULE_FIRMWARE("b43/ucode16_mimo.fw");
|
||||
MODULE_FIRMWARE("b43/ucode5.fw");
|
||||
MODULE_FIRMWARE("b43/ucode9.fw");
|
||||
|
||||
|
@ -316,12 +316,18 @@ int iwl4965_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
||||
|
||||
hdr_len = ieee80211_hdrlen(fc);
|
||||
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
/* For management frames use broadcast id to do not break aggregation */
|
||||
if (!ieee80211_is_data(fc))
|
||||
sta_id = ctx->bcast_sta_id;
|
||||
else {
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||
@ -1127,12 +1133,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
|
||||
q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) {
|
||||
|
||||
tx_info = &txq->txb[txq->q.read_ptr];
|
||||
iwl4965_tx_status(priv, tx_info,
|
||||
txq_id >= IWL4965_FIRST_AMPDU_QUEUE);
|
||||
|
||||
if (WARN_ON_ONCE(tx_info->skb == NULL))
|
||||
continue;
|
||||
|
||||
hdr = (struct ieee80211_hdr *)tx_info->skb->data;
|
||||
if (hdr && ieee80211_is_data_qos(hdr->frame_control))
|
||||
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||
nfreed++;
|
||||
|
||||
iwl4965_tx_status(priv, tx_info,
|
||||
txq_id >= IWL4965_FIRST_AMPDU_QUEUE);
|
||||
tx_info->skb = NULL;
|
||||
|
||||
priv->cfg->ops->lib->txq_free_tfd(priv, txq);
|
||||
|
@ -48,8 +48,21 @@ module_param(led_mode, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(led_mode, "0=system default, "
|
||||
"1=On(RF On)/Off(RF Off), 2=blinking");
|
||||
|
||||
/* Throughput OFF time(ms) ON time (ms)
|
||||
* >300 25 25
|
||||
* >200 to 300 40 40
|
||||
* >100 to 200 55 55
|
||||
* >70 to 100 65 65
|
||||
* >50 to 70 75 75
|
||||
* >20 to 50 85 85
|
||||
* >10 to 20 95 95
|
||||
* >5 to 10 110 110
|
||||
* >1 to 5 130 130
|
||||
* >0 to 1 167 167
|
||||
* <=0 SOLID ON
|
||||
*/
|
||||
static const struct ieee80211_tpt_blink iwl_blink[] = {
|
||||
{ .throughput = 0 * 1024 - 1, .blink_time = 334 },
|
||||
{ .throughput = 0, .blink_time = 334 },
|
||||
{ .throughput = 1 * 1024 - 1, .blink_time = 260 },
|
||||
{ .throughput = 5 * 1024 - 1, .blink_time = 220 },
|
||||
{ .throughput = 10 * 1024 - 1, .blink_time = 190 },
|
||||
@ -101,6 +114,11 @@ static int iwl_legacy_led_cmd(struct iwl_priv *priv,
|
||||
if (priv->blink_on == on && priv->blink_off == off)
|
||||
return 0;
|
||||
|
||||
if (off == 0) {
|
||||
/* led is SOLID_ON */
|
||||
on = IWL_LED_SOLID;
|
||||
}
|
||||
|
||||
IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n",
|
||||
priv->cfg->base_params->led_compensation);
|
||||
led_cmd.on = iwl_legacy_blink_compensation(priv, on,
|
||||
|
@ -2984,15 +2984,15 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
||||
struct iwl_priv *priv = container_of(work, struct iwl_priv,
|
||||
txpower_work);
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
/* If a scan happened to start before we got here
|
||||
* then just return; the statistics notification will
|
||||
* kick off another scheduled work to compensate for
|
||||
* any temperature delta we missed here. */
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
|
||||
test_bit(STATUS_SCANNING, &priv->status))
|
||||
return;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
goto out;
|
||||
|
||||
/* Regardless of if we are associated, we must reconfigure the
|
||||
* TX power since frames can be sent on non-radar channels while
|
||||
@ -3002,7 +3002,7 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
||||
/* Update last_temperature to keep is_calib_needed from running
|
||||
* when it isn't needed... */
|
||||
priv->last_temperature = priv->temperature;
|
||||
|
||||
out:
|
||||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
|
||||
|
@ -335,7 +335,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
struct ieee80211_channel *channel = conf->channel;
|
||||
const struct iwl_channel_info *ch_info;
|
||||
int ret = 0;
|
||||
bool ht_changed[NUM_IWL_RXON_CTX] = {};
|
||||
|
||||
IWL_DEBUG_MAC80211(priv, "changed %#x", changed);
|
||||
|
||||
@ -383,10 +382,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
|
||||
for_each_context(priv, ctx) {
|
||||
/* Configure HT40 channels */
|
||||
if (ctx->ht.enabled != conf_is_ht(conf)) {
|
||||
if (ctx->ht.enabled != conf_is_ht(conf))
|
||||
ctx->ht.enabled = conf_is_ht(conf);
|
||||
ht_changed[ctx->ctxid] = true;
|
||||
}
|
||||
|
||||
if (ctx->ht.enabled) {
|
||||
if (conf_is_ht40_minus(conf)) {
|
||||
@ -455,8 +452,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
|
||||
continue;
|
||||
iwlagn_commit_rxon(priv, ctx);
|
||||
if (ht_changed[ctx->ctxid])
|
||||
iwlagn_update_qos(priv, ctx);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
@ -568,12 +568,17 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
||||
|
||||
hdr_len = ieee80211_hdrlen(fc);
|
||||
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
/* For management frames use broadcast id to do not break aggregation */
|
||||
if (!ieee80211_is_data(fc))
|
||||
sta_id = ctx->bcast_sta_id;
|
||||
else {
|
||||
/* Find index into station table for destination station */
|
||||
sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||
@ -1224,12 +1229,16 @@ int iwlagn_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
|
||||
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
|
||||
|
||||
tx_info = &txq->txb[txq->q.read_ptr];
|
||||
iwlagn_tx_status(priv, tx_info,
|
||||
txq_id >= IWLAGN_FIRST_AMPDU_QUEUE);
|
||||
|
||||
if (WARN_ON_ONCE(tx_info->skb == NULL))
|
||||
continue;
|
||||
|
||||
hdr = (struct ieee80211_hdr *)tx_info->skb->data;
|
||||
if (hdr && ieee80211_is_data_qos(hdr->frame_control))
|
||||
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||
nfreed++;
|
||||
|
||||
iwlagn_tx_status(priv, tx_info,
|
||||
txq_id >= IWLAGN_FIRST_AMPDU_QUEUE);
|
||||
tx_info->skb = NULL;
|
||||
|
||||
if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl)
|
||||
|
@ -68,6 +68,7 @@ struct usbnet {
|
||||
# define EVENT_RX_PAUSED 5
|
||||
# define EVENT_DEV_WAKING 6
|
||||
# define EVENT_DEV_ASLEEP 7
|
||||
# define EVENT_DEV_OPEN 8
|
||||
};
|
||||
|
||||
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
||||
|
@ -587,10 +587,8 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
||||
hci_req_cancel(hdev, ENODEV);
|
||||
hci_req_lock(hdev);
|
||||
|
||||
/* Stop timer, it might be running */
|
||||
del_timer_sync(&hdev->cmd_timer);
|
||||
|
||||
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
|
||||
del_timer_sync(&hdev->cmd_timer);
|
||||
hci_req_unlock(hdev);
|
||||
return 0;
|
||||
}
|
||||
@ -629,6 +627,7 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
||||
|
||||
/* Drop last sent command */
|
||||
if (hdev->sent_cmd) {
|
||||
del_timer_sync(&hdev->cmd_timer);
|
||||
kfree_skb(hdev->sent_cmd);
|
||||
hdev->sent_cmd = NULL;
|
||||
}
|
||||
|
@ -2387,8 +2387,6 @@ static inline void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *s
|
||||
if (!conn)
|
||||
goto unlock;
|
||||
|
||||
hci_conn_hold(conn);
|
||||
|
||||
conn->remote_cap = ev->capability;
|
||||
conn->remote_oob = ev->oob_data;
|
||||
conn->remote_auth = ev->authentication;
|
||||
|
@ -1051,6 +1051,7 @@ static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq)
|
||||
tx_skb = skb_clone(skb, GFP_ATOMIC);
|
||||
bt_cb(skb)->retries++;
|
||||
control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE);
|
||||
control &= L2CAP_CTRL_SAR;
|
||||
|
||||
if (pi->conn_state & L2CAP_CONN_SEND_FBIT) {
|
||||
control |= L2CAP_CTRL_FINAL;
|
||||
|
@ -369,6 +369,15 @@ static void __sco_sock_close(struct sock *sk)
|
||||
|
||||
case BT_CONNECTED:
|
||||
case BT_CONFIG:
|
||||
if (sco_pi(sk)->conn) {
|
||||
sk->sk_state = BT_DISCONN;
|
||||
sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
|
||||
hci_conn_put(sco_pi(sk)->conn->hcon);
|
||||
sco_pi(sk)->conn = NULL;
|
||||
} else
|
||||
sco_chan_del(sk, ECONNRESET);
|
||||
break;
|
||||
|
||||
case BT_CONNECT:
|
||||
case BT_DISCONN:
|
||||
sco_chan_del(sk, ECONNRESET);
|
||||
|
@ -164,7 +164,7 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
|
||||
goto drop;
|
||||
|
||||
/* If STP is turned off, then forward */
|
||||
if (p->br->stp_enabled == BR_NO_STP)
|
||||
if (p->br->stp_enabled == BR_NO_STP && dest[5] == 0)
|
||||
goto forward;
|
||||
|
||||
if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
|
||||
|
@ -1427,9 +1427,14 @@ static int bcm_init(struct sock *sk)
|
||||
static int bcm_release(struct socket *sock)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct bcm_sock *bo = bcm_sk(sk);
|
||||
struct bcm_sock *bo;
|
||||
struct bcm_op *op, *next;
|
||||
|
||||
if (sk == NULL)
|
||||
return 0;
|
||||
|
||||
bo = bcm_sk(sk);
|
||||
|
||||
/* remove bcm_ops, timer, rx_unregister(), etc. */
|
||||
|
||||
unregister_netdevice_notifier(&bo->notifier);
|
||||
|
@ -305,7 +305,12 @@ static int raw_init(struct sock *sk)
|
||||
static int raw_release(struct socket *sock)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct raw_sock *ro = raw_sk(sk);
|
||||
struct raw_sock *ro;
|
||||
|
||||
if (!sk)
|
||||
return 0;
|
||||
|
||||
ro = raw_sk(sk);
|
||||
|
||||
unregister_netdevice_notifier(&ro->notifier);
|
||||
|
||||
|
@ -4773,7 +4773,7 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm
|
||||
* is never reached
|
||||
*/
|
||||
WARN_ON(1);
|
||||
err = -EINVAL;
|
||||
err = -ENOTTY;
|
||||
break;
|
||||
|
||||
}
|
||||
@ -5041,7 +5041,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||
/* Set the per device memory buffer space.
|
||||
* Not applicable in our case */
|
||||
case SIOCSIFLINK:
|
||||
return -EINVAL;
|
||||
return -ENOTTY;
|
||||
|
||||
/*
|
||||
* Unknown or private ioctl.
|
||||
@ -5062,7 +5062,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||
/* Take care of Wireless Extensions */
|
||||
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
|
||||
return wext_handle_ioctl(net, &ifr, cmd, arg);
|
||||
return -EINVAL;
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU
|
||||
default n
|
||||
|
||||
config NET_DSA_MV88E6131
|
||||
bool "Marvell 88E6095/6095F/6131 ethernet switch chip support"
|
||||
bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support"
|
||||
select NET_DSA_MV88E6XXX
|
||||
select NET_DSA_MV88E6XXX_NEED_PPU
|
||||
select NET_DSA_TAG_DSA
|
||||
---help---
|
||||
This enables support for the Marvell 88E6095/6095F/6131
|
||||
This enables support for the Marvell 88E6085/6095/6095F/6131
|
||||
ethernet switch chips.
|
||||
|
||||
config NET_DSA_MV88E6123_61_65
|
||||
|
@ -207,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
|
||||
* mode, but do not enable forwarding of unknown unicasts.
|
||||
*/
|
||||
val = 0x0433;
|
||||
if (p == dsa_upstream_port(ds))
|
||||
if (p == dsa_upstream_port(ds)) {
|
||||
val |= 0x0104;
|
||||
/*
|
||||
* On 6085, unknown multicast forward is controlled
|
||||
* here rather than in Port Control 2 register.
|
||||
*/
|
||||
if (ps->id == ID_6085)
|
||||
val |= 0x0008;
|
||||
}
|
||||
if (ds->dsa_port_mask & (1 << p))
|
||||
val |= 0x0100;
|
||||
REG_WRITE(addr, 0x04, val);
|
||||
@ -251,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
|
||||
* If this is the upstream port for this switch, enable
|
||||
* forwarding of unknown multicast addresses.
|
||||
*/
|
||||
val = 0x0080 | dsa_upstream_port(ds);
|
||||
if (p == dsa_upstream_port(ds))
|
||||
val |= 0x0040;
|
||||
REG_WRITE(addr, 0x08, val);
|
||||
if (ps->id == ID_6085)
|
||||
/*
|
||||
* on 6085, bits 3:0 are reserved, bit 6 control ARP
|
||||
* mirroring, and multicast forward is handled in
|
||||
* Port Control register.
|
||||
*/
|
||||
REG_WRITE(addr, 0x08, 0x0080);
|
||||
else {
|
||||
val = 0x0080 | dsa_upstream_port(ds);
|
||||
if (p == dsa_upstream_port(ds))
|
||||
val |= 0x0040;
|
||||
REG_WRITE(addr, 0x08, val);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rate Control: disable ingress rate limiting.
|
||||
|
@ -1680,7 +1680,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
|
||||
return;
|
||||
|
||||
cnf->sysctl = NULL;
|
||||
unregister_sysctl_table(t->sysctl_header);
|
||||
unregister_net_sysctl_table(t->sysctl_header);
|
||||
kfree(t->dev_name);
|
||||
kfree(t);
|
||||
}
|
||||
|
@ -1978,9 +1978,6 @@ struct fib_table *fib_trie_table(u32 id)
|
||||
t = (struct trie *) tb->tb_data;
|
||||
memset(t, 0, sizeof(*t));
|
||||
|
||||
if (id == RT_TABLE_LOCAL)
|
||||
pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION);
|
||||
|
||||
return tb;
|
||||
}
|
||||
|
||||
|
@ -2690,6 +2690,12 @@ static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
{
|
||||
}
|
||||
|
||||
static u32 *ipv4_rt_blackhole_cow_metrics(struct dst_entry *dst,
|
||||
unsigned long old)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct dst_ops ipv4_dst_blackhole_ops = {
|
||||
.family = AF_INET,
|
||||
.protocol = cpu_to_be16(ETH_P_IP),
|
||||
@ -2698,6 +2704,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
|
||||
.default_mtu = ipv4_blackhole_default_mtu,
|
||||
.default_advmss = ipv4_default_advmss,
|
||||
.update_pmtu = ipv4_rt_blackhole_update_pmtu,
|
||||
.cow_metrics = ipv4_rt_blackhole_cow_metrics,
|
||||
};
|
||||
|
||||
struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig)
|
||||
|
@ -4537,7 +4537,7 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
|
||||
|
||||
t = p->sysctl;
|
||||
p->sysctl = NULL;
|
||||
unregister_sysctl_table(t->sysctl_header);
|
||||
unregister_net_sysctl_table(t->sysctl_header);
|
||||
kfree(t->dev_name);
|
||||
kfree(t);
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
iv = esp_tmp_iv(aead, tmp, seqhilen);
|
||||
req = esp_tmp_req(aead, iv);
|
||||
asg = esp_req_sg(aead, req);
|
||||
sg = asg + 1;
|
||||
sg = asg + sglists;
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
|
@ -153,6 +153,12 @@ static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
{
|
||||
}
|
||||
|
||||
static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst,
|
||||
unsigned long old)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct dst_ops ip6_dst_blackhole_ops = {
|
||||
.family = AF_INET6,
|
||||
.protocol = cpu_to_be16(ETH_P_IPV6),
|
||||
@ -161,6 +167,7 @@ static struct dst_ops ip6_dst_blackhole_ops = {
|
||||
.default_mtu = ip6_blackhole_default_mtu,
|
||||
.default_advmss = ip6_default_advmss,
|
||||
.update_pmtu = ip6_rt_blackhole_update_pmtu,
|
||||
.cow_metrics = ip6_rt_blackhole_cow_metrics,
|
||||
};
|
||||
|
||||
static const u32 ip6_template_metrics[RTAX_MAX] = {
|
||||
@ -2012,7 +2019,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||
rt->dst.output = ip6_output;
|
||||
rt->rt6i_dev = net->loopback_dev;
|
||||
rt->rt6i_idev = idev;
|
||||
dst_metric_set(&rt->dst, RTAX_HOPLIMIT, -1);
|
||||
rt->dst.obsolete = -1;
|
||||
|
||||
rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
|
||||
|
@ -1335,7 +1335,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features)
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
/* Check if there is enough headroom to insert fragment header. */
|
||||
if ((skb_headroom(skb) < frag_hdr_sz) &&
|
||||
if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) &&
|
||||
pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC))
|
||||
goto out;
|
||||
|
||||
|
@ -1504,6 +1504,8 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
|
||||
enum ieee80211_smps_mode old_req;
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&sdata->u.mgd.mtx);
|
||||
|
||||
old_req = sdata->u.mgd.req_smps;
|
||||
sdata->u.mgd.req_smps = smps_mode;
|
||||
|
||||
|
@ -177,9 +177,9 @@ static int ieee80211_set_smps(struct ieee80211_sub_if_data *sdata,
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
mutex_lock(&sdata->u.mgd.mtx);
|
||||
err = __ieee80211_request_smps(sdata, smps_mode);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
mutex_unlock(&sdata->u.mgd.mtx);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *,
|
||||
int, int);
|
||||
static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t);
|
||||
static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t, int);
|
||||
|
||||
static const struct proto_ops unix_stream_ops = {
|
||||
.family = PF_UNIX,
|
||||
@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = {
|
||||
.setsockopt = sock_no_setsockopt,
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
.sendmsg = unix_seqpacket_sendmsg,
|
||||
.recvmsg = unix_dgram_recvmsg,
|
||||
.recvmsg = unix_seqpacket_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
.sendpage = sock_no_sendpage,
|
||||
};
|
||||
@ -1699,6 +1701,18 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
return unix_dgram_sendmsg(kiocb, sock, msg, len);
|
||||
}
|
||||
|
||||
static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t size,
|
||||
int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (sk->sk_state != TCP_ESTABLISHED)
|
||||
return -ENOTCONN;
|
||||
|
||||
return unix_dgram_recvmsg(iocb, sock, msg, size, flags);
|
||||
}
|
||||
|
||||
static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
|
@ -532,7 +532,7 @@ int xfrm_init_replay(struct xfrm_state *x)
|
||||
|
||||
if (replay_esn) {
|
||||
if (replay_esn->replay_window >
|
||||
replay_esn->bmp_len * sizeof(__u32))
|
||||
replay_esn->bmp_len * sizeof(__u32) * 8)
|
||||
return -EINVAL;
|
||||
|
||||
if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn)
|
||||
|
@ -124,6 +124,9 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
|
||||
{
|
||||
struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
|
||||
|
||||
if ((p->flags & XFRM_STATE_ESN) && !rt)
|
||||
return -EINVAL;
|
||||
|
||||
if (!rt)
|
||||
return 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user