Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/tg3.c
This commit is contained in:
commit
7143b7d412
28 changed files with 170 additions and 66 deletions
|
@ -6551,7 +6551,7 @@ S: Maintained
|
||||||
F: drivers/usb/host/uhci*
|
F: drivers/usb/host/uhci*
|
||||||
|
|
||||||
USB "USBNET" DRIVER FRAMEWORK
|
USB "USBNET" DRIVER FRAMEWORK
|
||||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
M: Oliver Neukum <oneukum@suse.de>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.linux-usb.org/usbnet
|
W: http://www.linux-usb.org/usbnet
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
|
@ -106,7 +106,7 @@ MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "M
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
|
||||||
module_param_array(speed_duplex, int, NULL, 0);
|
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_param_array(coalesce, bool, NULL, 0);
|
||||||
MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable");
|
MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable");
|
||||||
module_param_array(dynamic_ipg, bool, NULL, 0);
|
module_param_array(dynamic_ipg, bool, NULL, 0);
|
||||||
|
|
|
@ -8357,6 +8357,8 @@ bnx2_remove_one(struct pci_dev *pdev)
|
||||||
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
|
||||||
|
del_timer_sync(&bp->timer);
|
||||||
|
|
||||||
if (bp->mips_firmware)
|
if (bp->mips_firmware)
|
||||||
release_firmware(bp->mips_firmware);
|
release_firmware(bp->mips_firmware);
|
||||||
if (bp->rv2p_firmware)
|
if (bp->rv2p_firmware)
|
||||||
|
|
|
@ -346,10 +346,10 @@ static void sja1000_rx(struct net_device *dev)
|
||||||
| (priv->read_reg(priv, REG_ID2) >> 5);
|
| (priv->read_reg(priv, REG_ID2) >> 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cf->can_dlc = get_can_dlc(fi & 0x0F);
|
||||||
if (fi & FI_RTR) {
|
if (fi & FI_RTR) {
|
||||||
id |= CAN_RTR_FLAG;
|
id |= CAN_RTR_FLAG;
|
||||||
} else {
|
} else {
|
||||||
cf->can_dlc = get_can_dlc(fi & 0x0F);
|
|
||||||
for (i = 0; i < cf->can_dlc; i++)
|
for (i = 0; i < cf->can_dlc; i++)
|
||||||
cf->data[i] = priv->read_reg(priv, dreg++);
|
cf->data[i] = priv->read_reg(priv, dreg++);
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,11 +139,11 @@ static int ftmac100_reset(struct ftmac100 *priv)
|
||||||
* that hardware reset completed (what the f*ck).
|
* that hardware reset completed (what the f*ck).
|
||||||
* We still need to wait for a while.
|
* We still need to wait for a while.
|
||||||
*/
|
*/
|
||||||
usleep_range(500, 1000);
|
udelay(500);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
usleep_range(1000, 10000);
|
udelay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev_err(netdev, "software reset failed\n");
|
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)
|
if ((phycr & FTMAC100_PHYCR_MIIRD) == 0)
|
||||||
return phycr & FTMAC100_PHYCR_MIIRDATA;
|
return phycr & FTMAC100_PHYCR_MIIRDATA;
|
||||||
|
|
||||||
usleep_range(100, 1000);
|
udelay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev_err(netdev, "mdio read timed out\n");
|
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)
|
if ((phycr & FTMAC100_PHYCR_MIIWR) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
usleep_range(100, 1000);
|
udelay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev_err(netdev, "mdio write timed out\n");
|
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;
|
result |= ADVERTISED_100baseT_Half;
|
||||||
if (advert & ADVERTISE_100FULL)
|
if (advert & ADVERTISE_100FULL)
|
||||||
result |= ADVERTISED_100baseT_Full;
|
result |= ADVERTISED_100baseT_Full;
|
||||||
|
if (advert & ADVERTISE_PAUSE_CAP)
|
||||||
|
result |= ADVERTISED_Pause;
|
||||||
|
if (advert & ADVERTISE_PAUSE_ASYM)
|
||||||
|
result |= ADVERTISED_Asym_Pause;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12747,8 +12747,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||||
if (val & VCPU_CFGSHDW_ASPM_DBNC)
|
if (val & VCPU_CFGSHDW_ASPM_DBNC)
|
||||||
tg3_flag_set(tp, ASPM_WORKAROUND);
|
tg3_flag_set(tp, ASPM_WORKAROUND);
|
||||||
if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
|
if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
|
||||||
(val & VCPU_CFGSHDW_WOL_MAGPKT))
|
(val & VCPU_CFGSHDW_WOL_MAGPKT)) {
|
||||||
tg3_flag_set(tp, WOL_ENABLE);
|
tg3_flag_set(tp, WOL_ENABLE);
|
||||||
|
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||||
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12881,8 +12883,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||||
tg3_flag_clear(tp, WOL_CAP);
|
tg3_flag_clear(tp, WOL_CAP);
|
||||||
|
|
||||||
if (tg3_flag(tp, WOL_CAP) &&
|
if (tg3_flag(tp, WOL_CAP) &&
|
||||||
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE))
|
(nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) {
|
||||||
tg3_flag_set(tp, WOL_ENABLE);
|
tg3_flag_set(tp, WOL_ENABLE);
|
||||||
|
device_set_wakeup_enable(&tp->pdev->dev, true);
|
||||||
|
}
|
||||||
|
|
||||||
if (cfg2 & (1 << 17))
|
if (cfg2 & (1 << 17))
|
||||||
tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
|
tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
|
||||||
|
|
|
@ -460,7 +460,7 @@ static const struct driver_info cdc_info = {
|
||||||
.manage_power = cdc_manage_power,
|
.manage_power = cdc_manage_power,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct driver_info mbm_info = {
|
static const struct driver_info wwan_info = {
|
||||||
.description = "Mobile Broadband Network Device",
|
.description = "Mobile Broadband Network Device",
|
||||||
.flags = FLAG_WWAN,
|
.flags = FLAG_WWAN,
|
||||||
.bind = usbnet_cdc_bind,
|
.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 [] = {
|
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_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
||||||
USB_CDC_PROTO_NONE),
|
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
|
{ }, // END
|
||||||
};
|
};
|
||||||
|
|
|
@ -690,7 +690,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev)
|
||||||
msleep(10);
|
msleep(10);
|
||||||
bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
|
bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
|
||||||
timeout++;
|
timeout++;
|
||||||
} while ((bmcr & MII_BMCR) && (timeout < 100));
|
} while ((bmcr & BMCR_RESET) && (timeout < 100));
|
||||||
|
|
||||||
if (timeout >= 100) {
|
if (timeout >= 100) {
|
||||||
netdev_warn(dev->net, "timeout on PHY Reset");
|
netdev_warn(dev->net, "timeout on PHY Reset");
|
||||||
|
|
|
@ -645,6 +645,7 @@ int usbnet_stop (struct net_device *net)
|
||||||
struct driver_info *info = dev->driver_info;
|
struct driver_info *info = dev->driver_info;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
clear_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||||
netif_stop_queue (net);
|
netif_stop_queue (net);
|
||||||
|
|
||||||
netif_info(dev, ifdown, dev->net,
|
netif_info(dev, ifdown, dev->net,
|
||||||
|
@ -736,6 +737,7 @@ int usbnet_open (struct net_device *net)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||||
netif_start_queue (net);
|
netif_start_queue (net);
|
||||||
netif_info(dev, ifup, dev->net,
|
netif_info(dev, ifup, dev->net,
|
||||||
"open: enable queueing (rx %d, tx %d) mtu %d %s framing\n",
|
"open: enable queueing (rx %d, tx %d) mtu %d %s framing\n",
|
||||||
|
@ -1259,6 +1261,9 @@ void usbnet_disconnect (struct usb_interface *intf)
|
||||||
if (dev->driver_info->unbind)
|
if (dev->driver_info->unbind)
|
||||||
dev->driver_info->unbind (dev, intf);
|
dev->driver_info->unbind (dev, intf);
|
||||||
|
|
||||||
|
usb_kill_urb(dev->interrupt);
|
||||||
|
usb_free_urb(dev->interrupt);
|
||||||
|
|
||||||
free_netdev(net);
|
free_netdev(net);
|
||||||
usb_put_dev (xdev);
|
usb_put_dev (xdev);
|
||||||
}
|
}
|
||||||
|
@ -1498,6 +1503,10 @@ int usbnet_resume (struct usb_interface *intf)
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
if (!--dev->suspend_count) {
|
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);
|
spin_lock_irq(&dev->txq.lock);
|
||||||
while ((res = usb_get_from_anchor(&dev->deferred))) {
|
while ((res = usb_get_from_anchor(&dev->deferred))) {
|
||||||
|
|
||||||
|
@ -1516,9 +1525,12 @@ int usbnet_resume (struct usb_interface *intf)
|
||||||
smp_mb();
|
smp_mb();
|
||||||
clear_bit(EVENT_DEV_ASLEEP, &dev->flags);
|
clear_bit(EVENT_DEV_ASLEEP, &dev->flags);
|
||||||
spin_unlock_irq(&dev->txq.lock);
|
spin_unlock_irq(&dev->txq.lock);
|
||||||
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
|
||||||
netif_start_queue(dev->net);
|
if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
|
||||||
tasklet_schedule (&dev->bh);
|
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
||||||
|
netif_start_queue(dev->net);
|
||||||
|
tasklet_schedule (&dev->bh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -368,6 +368,17 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||||
if (tb[IFLA_ADDRESS] == NULL)
|
if (tb[IFLA_ADDRESS] == NULL)
|
||||||
random_ether_addr(dev->dev_addr);
|
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);
|
err = register_netdevice(dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err_register_dev;
|
goto err_register_dev;
|
||||||
|
@ -387,6 +398,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||||
|
|
||||||
err_register_dev:
|
err_register_dev:
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
|
err_alloc_name:
|
||||||
err_configure_peer:
|
err_configure_peer:
|
||||||
unregister_netdevice(peer);
|
unregister_netdevice(peer);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -72,6 +72,7 @@ MODULE_FIRMWARE("b43/ucode11.fw");
|
||||||
MODULE_FIRMWARE("b43/ucode13.fw");
|
MODULE_FIRMWARE("b43/ucode13.fw");
|
||||||
MODULE_FIRMWARE("b43/ucode14.fw");
|
MODULE_FIRMWARE("b43/ucode14.fw");
|
||||||
MODULE_FIRMWARE("b43/ucode15.fw");
|
MODULE_FIRMWARE("b43/ucode15.fw");
|
||||||
|
MODULE_FIRMWARE("b43/ucode16_mimo.fw");
|
||||||
MODULE_FIRMWARE("b43/ucode5.fw");
|
MODULE_FIRMWARE("b43/ucode5.fw");
|
||||||
MODULE_FIRMWARE("b43/ucode9.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);
|
hdr_len = ieee80211_hdrlen(fc);
|
||||||
|
|
||||||
/* Find index into station table for destination station */
|
/* For management frames use broadcast id to do not break aggregation */
|
||||||
sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
if (!ieee80211_is_data(fc))
|
||||||
if (sta_id == IWL_INVALID_STATION) {
|
sta_id = ctx->bcast_sta_id;
|
||||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
else {
|
||||||
hdr->addr1);
|
/* Find index into station table for destination station */
|
||||||
goto drop_unlock;
|
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);
|
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||||
|
|
|
@ -48,8 +48,21 @@ module_param(led_mode, int, S_IRUGO);
|
||||||
MODULE_PARM_DESC(led_mode, "0=system default, "
|
MODULE_PARM_DESC(led_mode, "0=system default, "
|
||||||
"1=On(RF On)/Off(RF Off), 2=blinking");
|
"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[] = {
|
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 = 1 * 1024 - 1, .blink_time = 260 },
|
||||||
{ .throughput = 5 * 1024 - 1, .blink_time = 220 },
|
{ .throughput = 5 * 1024 - 1, .blink_time = 220 },
|
||||||
{ .throughput = 10 * 1024 - 1, .blink_time = 190 },
|
{ .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)
|
if (priv->blink_on == on && priv->blink_off == off)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (off == 0) {
|
||||||
|
/* led is SOLID_ON */
|
||||||
|
on = IWL_LED_SOLID;
|
||||||
|
}
|
||||||
|
|
||||||
IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n",
|
IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n",
|
||||||
priv->cfg->base_params->led_compensation);
|
priv->cfg->base_params->led_compensation);
|
||||||
led_cmd.on = iwl_legacy_blink_compensation(priv, on,
|
led_cmd.on = iwl_legacy_blink_compensation(priv, on,
|
||||||
|
|
|
@ -2992,15 +2992,15 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
||||||
struct iwl_priv *priv = container_of(work, struct iwl_priv,
|
struct iwl_priv *priv = container_of(work, struct iwl_priv,
|
||||||
txpower_work);
|
txpower_work);
|
||||||
|
|
||||||
|
mutex_lock(&priv->mutex);
|
||||||
|
|
||||||
/* If a scan happened to start before we got here
|
/* If a scan happened to start before we got here
|
||||||
* then just return; the statistics notification will
|
* then just return; the statistics notification will
|
||||||
* kick off another scheduled work to compensate for
|
* kick off another scheduled work to compensate for
|
||||||
* any temperature delta we missed here. */
|
* any temperature delta we missed here. */
|
||||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
|
||||||
test_bit(STATUS_SCANNING, &priv->status))
|
test_bit(STATUS_SCANNING, &priv->status))
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
mutex_lock(&priv->mutex);
|
|
||||||
|
|
||||||
/* Regardless of if we are associated, we must reconfigure the
|
/* Regardless of if we are associated, we must reconfigure the
|
||||||
* TX power since frames can be sent on non-radar channels while
|
* TX power since frames can be sent on non-radar channels while
|
||||||
|
@ -3010,7 +3010,7 @@ static void iwl4965_bg_txpower_work(struct work_struct *work)
|
||||||
/* Update last_temperature to keep is_calib_needed from running
|
/* Update last_temperature to keep is_calib_needed from running
|
||||||
* when it isn't needed... */
|
* when it isn't needed... */
|
||||||
priv->last_temperature = priv->temperature;
|
priv->last_temperature = priv->temperature;
|
||||||
|
out:
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -582,12 +582,17 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
||||||
|
|
||||||
hdr_len = ieee80211_hdrlen(fc);
|
hdr_len = ieee80211_hdrlen(fc);
|
||||||
|
|
||||||
/* Find index into station table for destination station */
|
/* For management frames use broadcast id to do not break aggregation */
|
||||||
sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta);
|
if (!ieee80211_is_data(fc))
|
||||||
if (sta_id == IWL_INVALID_STATION) {
|
sta_id = ctx->bcast_sta_id;
|
||||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
else {
|
||||||
hdr->addr1);
|
/* Find index into station table for destination station */
|
||||||
goto drop_unlock;
|
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);
|
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||||
|
|
|
@ -68,6 +68,7 @@ struct usbnet {
|
||||||
# define EVENT_RX_PAUSED 5
|
# define EVENT_RX_PAUSED 5
|
||||||
# define EVENT_DEV_WAKING 6
|
# define EVENT_DEV_WAKING 6
|
||||||
# define EVENT_DEV_ASLEEP 7
|
# define EVENT_DEV_ASLEEP 7
|
||||||
|
# define EVENT_DEV_OPEN 8
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
||||||
|
|
|
@ -4783,7 +4783,7 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm
|
||||||
* is never reached
|
* is never reached
|
||||||
*/
|
*/
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
err = -EINVAL;
|
err = -ENOTTY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5051,7 +5051,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||||
/* Set the per device memory buffer space.
|
/* Set the per device memory buffer space.
|
||||||
* Not applicable in our case */
|
* Not applicable in our case */
|
||||||
case SIOCSIFLINK:
|
case SIOCSIFLINK:
|
||||||
return -EINVAL;
|
return -ENOTTY;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unknown or private ioctl.
|
* Unknown or private ioctl.
|
||||||
|
@ -5072,7 +5072,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||||
/* Take care of Wireless Extensions */
|
/* Take care of Wireless Extensions */
|
||||||
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
|
if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
|
||||||
return wext_handle_ioctl(net, &ifr, cmd, arg);
|
return wext_handle_ioctl(net, &ifr, cmd, arg);
|
||||||
return -EINVAL;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config NET_DSA_MV88E6131
|
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
|
||||||
select NET_DSA_MV88E6XXX_NEED_PPU
|
select NET_DSA_MV88E6XXX_NEED_PPU
|
||||||
select NET_DSA_TAG_DSA
|
select NET_DSA_TAG_DSA
|
||||||
---help---
|
---help---
|
||||||
This enables support for the Marvell 88E6095/6095F/6131
|
This enables support for the Marvell 88E6085/6095/6095F/6131
|
||||||
ethernet switch chips.
|
ethernet switch chips.
|
||||||
|
|
||||||
config NET_DSA_MV88E6123_61_65
|
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.
|
* mode, but do not enable forwarding of unknown unicasts.
|
||||||
*/
|
*/
|
||||||
val = 0x0433;
|
val = 0x0433;
|
||||||
if (p == dsa_upstream_port(ds))
|
if (p == dsa_upstream_port(ds)) {
|
||||||
val |= 0x0104;
|
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))
|
if (ds->dsa_port_mask & (1 << p))
|
||||||
val |= 0x0100;
|
val |= 0x0100;
|
||||||
REG_WRITE(addr, 0x04, val);
|
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
|
* If this is the upstream port for this switch, enable
|
||||||
* forwarding of unknown multicast addresses.
|
* forwarding of unknown multicast addresses.
|
||||||
*/
|
*/
|
||||||
val = 0x0080 | dsa_upstream_port(ds);
|
if (ps->id == ID_6085)
|
||||||
if (p == dsa_upstream_port(ds))
|
/*
|
||||||
val |= 0x0040;
|
* on 6085, bits 3:0 are reserved, bit 6 control ARP
|
||||||
REG_WRITE(addr, 0x08, val);
|
* 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.
|
* Rate Control: disable ingress rate limiting.
|
||||||
|
|
|
@ -1680,7 +1680,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cnf->sysctl = NULL;
|
cnf->sysctl = NULL;
|
||||||
unregister_sysctl_table(t->sysctl_header);
|
unregister_net_sysctl_table(t->sysctl_header);
|
||||||
kfree(t->dev_name);
|
kfree(t->dev_name);
|
||||||
kfree(t);
|
kfree(t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1998,9 +1998,6 @@ struct fib_table *fib_trie_table(u32 id)
|
||||||
t = (struct trie *) tb->tb_data;
|
t = (struct trie *) tb->tb_data;
|
||||||
memset(t, 0, sizeof(*t));
|
memset(t, 0, sizeof(*t));
|
||||||
|
|
||||||
if (id == RT_TABLE_LOCAL)
|
|
||||||
pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION);
|
|
||||||
|
|
||||||
return tb;
|
return tb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,31 +223,30 @@ static void ip_expire(unsigned long arg)
|
||||||
|
|
||||||
if ((qp->q.last_in & INET_FRAG_FIRST_IN) && qp->q.fragments != NULL) {
|
if ((qp->q.last_in & INET_FRAG_FIRST_IN) && qp->q.fragments != NULL) {
|
||||||
struct sk_buff *head = qp->q.fragments;
|
struct sk_buff *head = qp->q.fragments;
|
||||||
|
const struct iphdr *iph;
|
||||||
|
int err;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
head->dev = dev_get_by_index_rcu(net, qp->iif);
|
head->dev = dev_get_by_index_rcu(net, qp->iif);
|
||||||
if (!head->dev)
|
if (!head->dev)
|
||||||
goto out_rcu_unlock;
|
goto out_rcu_unlock;
|
||||||
|
|
||||||
|
/* skb dst is stale, drop it, and perform route lookup again */
|
||||||
|
skb_dst_drop(head);
|
||||||
|
iph = ip_hdr(head);
|
||||||
|
err = ip_route_input_noref(head, iph->daddr, iph->saddr,
|
||||||
|
iph->tos, head->dev);
|
||||||
|
if (err)
|
||||||
|
goto out_rcu_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only search router table for the head fragment,
|
* Only an end host needs to send an ICMP
|
||||||
* when defraging timeout at PRE_ROUTING HOOK.
|
* "Fragment Reassembly Timeout" message, per RFC792.
|
||||||
*/
|
*/
|
||||||
if (qp->user == IP_DEFRAG_CONNTRACK_IN && !skb_dst(head)) {
|
if (qp->user == IP_DEFRAG_CONNTRACK_IN &&
|
||||||
const struct iphdr *iph = ip_hdr(head);
|
skb_rtable(head)->rt_type != RTN_LOCAL)
|
||||||
int err = ip_route_input(head, iph->daddr, iph->saddr,
|
goto out_rcu_unlock;
|
||||||
iph->tos, head->dev);
|
|
||||||
if (unlikely(err))
|
|
||||||
goto out_rcu_unlock;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Only an end host needs to send an ICMP
|
|
||||||
* "Fragment Reassembly Timeout" message, per RFC792.
|
|
||||||
*/
|
|
||||||
if (skb_rtable(head)->rt_type != RTN_LOCAL)
|
|
||||||
goto out_rcu_unlock;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send an ICMP "Fragment Reassembly Timeout" message. */
|
/* Send an ICMP "Fragment Reassembly Timeout" message. */
|
||||||
icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
|
icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
|
||||||
|
|
|
@ -4539,7 +4539,7 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
|
||||||
|
|
||||||
t = p->sysctl;
|
t = p->sysctl;
|
||||||
p->sysctl = NULL;
|
p->sysctl = NULL;
|
||||||
unregister_sysctl_table(t->sysctl_header);
|
unregister_net_sysctl_table(t->sysctl_header);
|
||||||
kfree(t->dev_name);
|
kfree(t->dev_name);
|
||||||
kfree(t);
|
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);
|
iv = esp_tmp_iv(aead, tmp, seqhilen);
|
||||||
req = esp_tmp_req(aead, iv);
|
req = esp_tmp_req(aead, iv);
|
||||||
asg = esp_req_sg(aead, req);
|
asg = esp_req_sg(aead, req);
|
||||||
sg = asg + 1;
|
sg = asg + sglists;
|
||||||
|
|
||||||
skb->ip_summed = CHECKSUM_NONE;
|
skb->ip_summed = CHECKSUM_NONE;
|
||||||
|
|
||||||
|
|
|
@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *,
|
||||||
int, int);
|
int, int);
|
||||||
static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
|
static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
|
||||||
struct msghdr *, size_t);
|
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 = {
|
static const struct proto_ops unix_stream_ops = {
|
||||||
.family = PF_UNIX,
|
.family = PF_UNIX,
|
||||||
|
@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = {
|
||||||
.setsockopt = sock_no_setsockopt,
|
.setsockopt = sock_no_setsockopt,
|
||||||
.getsockopt = sock_no_getsockopt,
|
.getsockopt = sock_no_getsockopt,
|
||||||
.sendmsg = unix_seqpacket_sendmsg,
|
.sendmsg = unix_seqpacket_sendmsg,
|
||||||
.recvmsg = unix_dgram_recvmsg,
|
.recvmsg = unix_seqpacket_recvmsg,
|
||||||
.mmap = sock_no_mmap,
|
.mmap = sock_no_mmap,
|
||||||
.sendpage = sock_no_sendpage,
|
.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);
|
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)
|
static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
|
||||||
{
|
{
|
||||||
struct unix_sock *u = unix_sk(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) {
|
||||||
if (replay_esn->replay_window >
|
if (replay_esn->replay_window >
|
||||||
replay_esn->bmp_len * sizeof(__u32))
|
replay_esn->bmp_len * sizeof(__u32) * 8)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn)
|
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];
|
struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
|
||||||
|
|
||||||
|
if ((p->flags & XFRM_STATE_ESN) && !rt)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!rt)
|
if (!rt)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue