Merge git://github.com/davem330/net
* git://github.com/davem330/net: (27 commits) xfrm: Perform a replay check after return from async codepaths fib:fix BUG_ON in fib_nl_newrule when add new fib rule ixgbe: fix possible null buffer error tg3: fix VLAN tagging regression net: pxa168: Fix build errors by including interrupt.h netconsole: switch init_netconsole() to late_initcall gianfar: Fix overflow check and return value for gfar_get_cls_all() ppp_generic: fix multilink fragment MTU calculation (again) GRETH: avoid overwrite IP-stack's IP-frags checksum GRETH: RX/TX bytes were never increased ipv6: fix a possible double free b43: Fix beacon problem in ad-hoc mode Bluetooth: add support for 2011 mac mini Bluetooth: Add MacBookAir4,1 support Bluetooth: Fixed BT ST Channel reg order r8169: do not enable the TBI for anything but the original 8169. r8169: remove erroneous processing of always set bit. r8169: fix WOL setting for 8105 and 8111evl r8169: add MODULE_FIRMWARE for the firmware of 8111evl r8169: fix the reset setting for 8111evl ...
This commit is contained in:
commit
e5b26a88f1
|
@ -72,9 +72,15 @@ static struct usb_device_id btusb_table[] = {
|
|||
/* Apple MacBookAir3,1, MacBookAir3,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821b) },
|
||||
|
||||
/* Apple MacBookAir4,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x821f) },
|
||||
|
||||
/* Apple MacBookPro8,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821a) },
|
||||
|
||||
/* Apple MacMini5,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8281) },
|
||||
|
||||
/* AVM BlueFRITZ! USB v2.0 */
|
||||
{ USB_DEVICE(0x057c, 0x3800) },
|
||||
|
||||
|
|
|
@ -124,6 +124,13 @@ static long st_receive(void *priv_data, struct sk_buff *skb)
|
|||
/* ------- Interfaces to HCI layer ------ */
|
||||
/* protocol structure registered with shared transport */
|
||||
static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = {
|
||||
{
|
||||
.chnl_id = HCI_EVENT_PKT, /* HCI Events */
|
||||
.hdr_len = sizeof(struct hci_event_hdr),
|
||||
.offset_len_in_hdr = offsetof(struct hci_event_hdr, plen),
|
||||
.len_size = 1, /* sizeof(plen) in struct hci_event_hdr */
|
||||
.reserve = 8,
|
||||
},
|
||||
{
|
||||
.chnl_id = HCI_ACLDATA_PKT, /* ACL */
|
||||
.hdr_len = sizeof(struct hci_acl_hdr),
|
||||
|
@ -138,13 +145,6 @@ static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = {
|
|||
.len_size = 1, /* sizeof(dlen) in struct hci_sco_hdr */
|
||||
.reserve = 8,
|
||||
},
|
||||
{
|
||||
.chnl_id = HCI_EVENT_PKT, /* HCI Events */
|
||||
.hdr_len = sizeof(struct hci_event_hdr),
|
||||
.offset_len_in_hdr = offsetof(struct hci_event_hdr, plen),
|
||||
.len_size = 1, /* sizeof(plen) in struct hci_event_hdr */
|
||||
.reserve = 8,
|
||||
},
|
||||
};
|
||||
|
||||
/* Called from HCI core to initialize the device */
|
||||
|
@ -240,7 +240,7 @@ static int ti_st_close(struct hci_dev *hdev)
|
|||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < MAX_BT_CHNL_IDS; i++) {
|
||||
for (i = MAX_BT_CHNL_IDS-1; i >= 0; i--) {
|
||||
err = st_unregister(&ti_st_proto[i]);
|
||||
if (err)
|
||||
BT_ERR("st_unregister(%d) failed with error %d",
|
||||
|
|
|
@ -1669,10 +1669,10 @@ static int gfar_get_cls_all(struct gfar_private *priv,
|
|||
u32 i = 0;
|
||||
|
||||
list_for_each_entry(comp, &priv->rx_list.list, list) {
|
||||
if (i <= cmd->rule_cnt) {
|
||||
rule_locs[i] = comp->fs.location;
|
||||
i++;
|
||||
}
|
||||
if (i == cmd->rule_cnt)
|
||||
return -EMSGSIZE;
|
||||
rule_locs[i] = comp->fs.location;
|
||||
i++;
|
||||
}
|
||||
|
||||
cmd->data = MAX_FILER_IDX;
|
||||
|
|
|
@ -428,6 +428,7 @@ greth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dma_sync_single_for_device(greth->dev, dma_addr, skb->len, DMA_TO_DEVICE);
|
||||
|
||||
status = GRETH_BD_EN | GRETH_BD_IE | (skb->len & GRETH_BD_LEN);
|
||||
greth->tx_bufs_length[greth->tx_next] = skb->len & GRETH_BD_LEN;
|
||||
|
||||
/* Wrap around descriptor ring */
|
||||
if (greth->tx_next == GRETH_TXBD_NUM_MASK) {
|
||||
|
@ -490,7 +491,8 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (nr_frags != 0)
|
||||
status = GRETH_TXBD_MORE;
|
||||
|
||||
status |= GRETH_TXBD_CSALL;
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||
status |= GRETH_TXBD_CSALL;
|
||||
status |= skb_headlen(skb) & GRETH_BD_LEN;
|
||||
if (greth->tx_next == GRETH_TXBD_NUM_MASK)
|
||||
status |= GRETH_BD_WR;
|
||||
|
@ -513,7 +515,9 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
|||
greth->tx_skbuff[curr_tx] = NULL;
|
||||
bdp = greth->tx_bd_base + curr_tx;
|
||||
|
||||
status = GRETH_TXBD_CSALL | GRETH_BD_EN;
|
||||
status = GRETH_BD_EN;
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||
status |= GRETH_TXBD_CSALL;
|
||||
status |= frag->size & GRETH_BD_LEN;
|
||||
|
||||
/* Wrap around descriptor ring */
|
||||
|
@ -641,6 +645,7 @@ static void greth_clean_tx(struct net_device *dev)
|
|||
dev->stats.tx_fifo_errors++;
|
||||
}
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += greth->tx_bufs_length[greth->tx_last];
|
||||
greth->tx_last = NEXT_TX(greth->tx_last);
|
||||
greth->tx_free++;
|
||||
}
|
||||
|
@ -695,6 +700,7 @@ static void greth_clean_tx_gbit(struct net_device *dev)
|
|||
greth->tx_skbuff[greth->tx_last] = NULL;
|
||||
|
||||
greth_update_tx_stats(dev, stat);
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
|
||||
bdp = greth->tx_bd_base + greth->tx_last;
|
||||
|
||||
|
@ -796,6 +802,7 @@ static int greth_rx(struct net_device *dev, int limit)
|
|||
memcpy(skb_put(skb, pkt_len), phys_to_virt(dma_addr), pkt_len);
|
||||
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
dev->stats.rx_bytes += pkt_len;
|
||||
dev->stats.rx_packets++;
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
@ -910,6 +917,7 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
|||
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += pkt_len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
greth->rx_skbuff[greth->rx_cur] = newskb;
|
||||
|
|
|
@ -103,6 +103,7 @@ struct greth_private {
|
|||
|
||||
unsigned char *tx_bufs[GRETH_TXBD_NUM];
|
||||
unsigned char *rx_bufs[GRETH_RXBD_NUM];
|
||||
u16 tx_bufs_length[GRETH_TXBD_NUM];
|
||||
|
||||
u16 tx_next;
|
||||
u16 tx_last;
|
||||
|
|
|
@ -1321,8 +1321,8 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
if (ring_is_rsc_enabled(rx_ring))
|
||||
pkt_is_rsc = ixgbe_get_rsc_state(rx_desc);
|
||||
|
||||
/* if this is a skb from previous receive DMA will be 0 */
|
||||
if (rx_buffer_info->dma) {
|
||||
/* linear means we are building an skb from multiple pages */
|
||||
if (!skb_is_nonlinear(skb)) {
|
||||
u16 hlen;
|
||||
if (pkt_is_rsc &&
|
||||
!(staterr & IXGBE_RXD_STAT_EOP) &&
|
||||
|
|
|
@ -799,5 +799,11 @@ static void __exit cleanup_netconsole(void)
|
|||
}
|
||||
}
|
||||
|
||||
module_init(init_netconsole);
|
||||
/*
|
||||
* Use late_initcall to ensure netconsole is
|
||||
* initialized after network device driver if built-in.
|
||||
*
|
||||
* late_initcall() and module_init() are identical if built as module.
|
||||
*/
|
||||
late_initcall(init_netconsole);
|
||||
module_exit(cleanup_netconsole);
|
||||
|
|
|
@ -1465,7 +1465,12 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
|
|||
continue;
|
||||
}
|
||||
|
||||
mtu = pch->chan->mtu - hdrlen;
|
||||
/*
|
||||
* hdrlen includes the 2-byte PPP protocol field, but the
|
||||
* MTU counts only the payload excluding the protocol field.
|
||||
* (RFC1661 Section 2)
|
||||
*/
|
||||
mtu = pch->chan->mtu - (hdrlen - 2);
|
||||
if (mtu < 4)
|
||||
mtu = 4;
|
||||
if (flen > mtu)
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/system.h>
|
||||
|
|
|
@ -407,6 +407,7 @@ enum rtl_register_content {
|
|||
RxOK = 0x0001,
|
||||
|
||||
/* RxStatusDesc */
|
||||
RxBOVF = (1 << 24),
|
||||
RxFOVF = (1 << 23),
|
||||
RxRWT = (1 << 22),
|
||||
RxRES = (1 << 21),
|
||||
|
@ -682,6 +683,7 @@ struct rtl8169_private {
|
|||
struct mii_if_info mii;
|
||||
struct rtl8169_counters counters;
|
||||
u32 saved_wolopts;
|
||||
u32 opts1_mask;
|
||||
|
||||
struct rtl_fw {
|
||||
const struct firmware *fw;
|
||||
|
@ -710,6 +712,7 @@ MODULE_FIRMWARE(FIRMWARE_8168D_1);
|
|||
MODULE_FIRMWARE(FIRMWARE_8168D_2);
|
||||
MODULE_FIRMWARE(FIRMWARE_8168E_1);
|
||||
MODULE_FIRMWARE(FIRMWARE_8168E_2);
|
||||
MODULE_FIRMWARE(FIRMWARE_8168E_3);
|
||||
MODULE_FIRMWARE(FIRMWARE_8105E_1);
|
||||
|
||||
static int rtl8169_open(struct net_device *dev);
|
||||
|
@ -3077,6 +3080,14 @@ static void rtl8169_phy_reset(struct net_device *dev,
|
|||
netif_err(tp, link, dev, "PHY reset failed\n");
|
||||
}
|
||||
|
||||
static bool rtl_tbi_enabled(struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
return (tp->mac_version == RTL_GIGA_MAC_VER_01) &&
|
||||
(RTL_R8(PHYstatus) & TBI_Enable);
|
||||
}
|
||||
|
||||
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
@ -3109,7 +3120,7 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
|
|||
ADVERTISED_1000baseT_Half |
|
||||
ADVERTISED_1000baseT_Full : 0));
|
||||
|
||||
if (RTL_R8(PHYstatus) & TBI_Enable)
|
||||
if (rtl_tbi_enabled(tp))
|
||||
netif_info(tp, link, dev, "TBI auto-negotiating\n");
|
||||
}
|
||||
|
||||
|
@ -3319,9 +3330,16 @@ static void r810x_phy_power_up(struct rtl8169_private *tp)
|
|||
|
||||
static void r810x_pll_power_down(struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
if (__rtl8169_get_wol(tp) & WAKE_ANY) {
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, MII_BMCR, 0x0000);
|
||||
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_29 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_30)
|
||||
RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast |
|
||||
AcceptMulticast | AcceptMyPhys);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3417,7 +3435,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
|
|||
rtl_writephy(tp, MII_BMCR, 0x0000);
|
||||
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_33)
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_33 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_34)
|
||||
RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast |
|
||||
AcceptMulticast | AcceptMyPhys);
|
||||
return;
|
||||
|
@ -3727,8 +3746,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
|
||||
if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
|
||||
(RTL_R8(PHYstatus) & TBI_Enable)) {
|
||||
if (rtl_tbi_enabled(tp)) {
|
||||
tp->set_speed = rtl8169_set_speed_tbi;
|
||||
tp->get_settings = rtl8169_gset_tbi;
|
||||
tp->phy_reset_enable = rtl8169_tbi_reset_enable;
|
||||
|
@ -3777,6 +3795,9 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
tp->intr_event = cfg->intr_event;
|
||||
tp->napi_event = cfg->napi_event;
|
||||
|
||||
tp->opts1_mask = (tp->mac_version != RTL_GIGA_MAC_VER_01) ?
|
||||
~(RxBOVF | RxFOVF) : ~0;
|
||||
|
||||
init_timer(&tp->timer);
|
||||
tp->timer.data = (unsigned long) dev;
|
||||
tp->timer.function = rtl8169_phy_timer;
|
||||
|
@ -3988,6 +4009,7 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
|
|||
while (RTL_R8(TxPoll) & NPQ)
|
||||
udelay(20);
|
||||
} else if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
|
||||
RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
|
||||
while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
|
||||
udelay(100);
|
||||
} else {
|
||||
|
@ -5314,7 +5336,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
|
|||
u32 status;
|
||||
|
||||
rmb();
|
||||
status = le32_to_cpu(desc->opts1);
|
||||
status = le32_to_cpu(desc->opts1) & tp->opts1_mask;
|
||||
|
||||
if (status & DescOwn)
|
||||
break;
|
||||
|
|
|
@ -6234,12 +6234,10 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef BCM_KERNEL_SUPPORTS_8021Q
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
base_flags |= TXD_FLAG_VLAN;
|
||||
vlan = vlan_tx_tag_get(skb);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
|
||||
!mss && skb->len > VLAN_ETH_FRAME_LEN)
|
||||
|
|
|
@ -1632,7 +1632,8 @@ static void handle_irq_beacon(struct b43_wldev *dev)
|
|||
u32 cmd, beacon0_valid, beacon1_valid;
|
||||
|
||||
if (!b43_is_mode(wl, NL80211_IFTYPE_AP) &&
|
||||
!b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
|
||||
!b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) &&
|
||||
!b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
|
||||
return;
|
||||
|
||||
/* This is the bottom half of the asynchronous beacon update. */
|
||||
|
|
|
@ -1901,17 +1901,19 @@ static void ipw2100_down(struct ipw2100_priv *priv)
|
|||
|
||||
/* Called by register_netdev() */
|
||||
static int ipw2100_net_init(struct net_device *dev)
|
||||
{
|
||||
struct ipw2100_priv *priv = libipw_priv(dev);
|
||||
|
||||
return ipw2100_up(priv, 1);
|
||||
}
|
||||
|
||||
static int ipw2100_wdev_init(struct net_device *dev)
|
||||
{
|
||||
struct ipw2100_priv *priv = libipw_priv(dev);
|
||||
const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
|
||||
struct wireless_dev *wdev = &priv->ieee->wdev;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = ipw2100_up(priv, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
|
||||
|
||||
/* fill-out priv->ieee->bg_band */
|
||||
|
@ -6350,9 +6352,13 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
|||
"Error calling register_netdev.\n");
|
||||
goto fail;
|
||||
}
|
||||
registered = 1;
|
||||
|
||||
err = ipw2100_wdev_init(dev);
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
mutex_lock(&priv->action_mutex);
|
||||
registered = 1;
|
||||
|
||||
IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
|
||||
|
||||
|
@ -6389,7 +6395,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
|||
|
||||
fail_unlock:
|
||||
mutex_unlock(&priv->action_mutex);
|
||||
|
||||
wiphy_unregister(priv->ieee->wdev.wiphy);
|
||||
kfree(priv->ieee->bg_band.channels);
|
||||
fail:
|
||||
if (dev) {
|
||||
if (registered)
|
||||
|
|
|
@ -11424,17 +11424,24 @@ static void ipw_bg_down(struct work_struct *work)
|
|||
|
||||
/* Called by register_netdev() */
|
||||
static int ipw_net_init(struct net_device *dev)
|
||||
{
|
||||
int rc = 0;
|
||||
struct ipw_priv *priv = libipw_priv(dev);
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
if (ipw_up(priv))
|
||||
rc = -EIO;
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ipw_wdev_init(struct net_device *dev)
|
||||
{
|
||||
int i, rc = 0;
|
||||
struct ipw_priv *priv = libipw_priv(dev);
|
||||
const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
|
||||
struct wireless_dev *wdev = &priv->ieee->wdev;
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (ipw_up(priv)) {
|
||||
rc = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
|
||||
|
||||
|
@ -11519,13 +11526,9 @@ static int ipw_net_init(struct net_device *dev)
|
|||
set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
|
||||
|
||||
/* With that information in place, we can now register the wiphy... */
|
||||
if (wiphy_register(wdev->wiphy)) {
|
||||
if (wiphy_register(wdev->wiphy))
|
||||
rc = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&priv->mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -11832,14 +11835,22 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
|||
goto out_remove_sysfs;
|
||||
}
|
||||
|
||||
err = ipw_wdev_init(net_dev);
|
||||
if (err) {
|
||||
IPW_ERROR("failed to register wireless device\n");
|
||||
goto out_unregister_netdev;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IPW2200_PROMISCUOUS
|
||||
if (rtap_iface) {
|
||||
err = ipw_prom_alloc(priv);
|
||||
if (err) {
|
||||
IPW_ERROR("Failed to register promiscuous network "
|
||||
"device (error %d).\n", err);
|
||||
unregister_netdev(priv->net_dev);
|
||||
goto out_remove_sysfs;
|
||||
wiphy_unregister(priv->ieee->wdev.wiphy);
|
||||
kfree(priv->ieee->a_band.channels);
|
||||
kfree(priv->ieee->bg_band.channels);
|
||||
goto out_unregister_netdev;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -11851,6 +11862,8 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
return 0;
|
||||
|
||||
out_unregister_netdev:
|
||||
unregister_netdev(priv->net_dev);
|
||||
out_remove_sysfs:
|
||||
sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
|
||||
out_release_irq:
|
||||
|
|
|
@ -2140,7 +2140,12 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
|
|||
IEEE80211_HW_SPECTRUM_MGMT |
|
||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS;
|
||||
|
||||
/*
|
||||
* Including the following line will crash some AP's. This
|
||||
* workaround removes the stimulus which causes the crash until
|
||||
* the AP software can be fixed.
|
||||
hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
|
||||
*/
|
||||
|
||||
hw->flags |= IEEE80211_HW_SUPPORTS_PS |
|
||||
IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
|
||||
|
|
|
@ -3697,14 +3697,15 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
|
|||
rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, ®);
|
||||
|
||||
/* Apparently the data is read from end to start */
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3,
|
||||
(u32 *)&rt2x00dev->eeprom[i]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 2]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 4]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 6]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, ®);
|
||||
/* The returned value is in CPU order, but eeprom is le */
|
||||
rt2x00dev->eeprom[i] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
|
||||
|
||||
mutex_unlock(&rt2x00dev->csr_mutex);
|
||||
}
|
||||
|
@ -3870,19 +3871,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!rt2x00_rf(rt2x00dev, RF2820) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2850) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2720) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2750) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3020) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2020) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3021) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3022) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3052) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3320) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5370) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5390)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
switch (rt2x00dev->chip.rf) {
|
||||
case RF2820:
|
||||
case RF2850:
|
||||
case RF2720:
|
||||
case RF2750:
|
||||
case RF3020:
|
||||
case RF2020:
|
||||
case RF3021:
|
||||
case RF3022:
|
||||
case RF3052:
|
||||
case RF3320:
|
||||
case RF5370:
|
||||
case RF5390:
|
||||
break;
|
||||
default:
|
||||
ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
|
||||
rt2x00dev->chip.rf);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
@ -58,8 +58,8 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
if (status)
|
||||
return;
|
||||
|
||||
if (test_bit(HCI_MGMT, &hdev->flags) &&
|
||||
test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
||||
if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
|
||||
test_bit(HCI_MGMT, &hdev->flags))
|
||||
mgmt_discovering(hdev->id, 0);
|
||||
|
||||
hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status);
|
||||
|
@ -76,8 +76,8 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
if (status)
|
||||
return;
|
||||
|
||||
if (test_bit(HCI_MGMT, &hdev->flags) &&
|
||||
test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
||||
if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
|
||||
test_bit(HCI_MGMT, &hdev->flags))
|
||||
mgmt_discovering(hdev->id, 0);
|
||||
|
||||
hci_conn_check_pending(hdev);
|
||||
|
@ -959,9 +959,8 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
|
|||
return;
|
||||
}
|
||||
|
||||
if (test_bit(HCI_MGMT, &hdev->flags) &&
|
||||
!test_and_set_bit(HCI_INQUIRY,
|
||||
&hdev->flags))
|
||||
if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags) &&
|
||||
test_bit(HCI_MGMT, &hdev->flags))
|
||||
mgmt_discovering(hdev->id, 1);
|
||||
}
|
||||
|
||||
|
@ -1340,8 +1339,8 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff
|
|||
|
||||
BT_DBG("%s status %d", hdev->name, status);
|
||||
|
||||
if (test_bit(HCI_MGMT, &hdev->flags) &&
|
||||
test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
||||
if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
|
||||
test_bit(HCI_MGMT, &hdev->flags))
|
||||
mgmt_discovering(hdev->id, 0);
|
||||
|
||||
hci_req_complete(hdev, HCI_OP_INQUIRY, status);
|
||||
|
|
|
@ -384,8 +384,8 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
|
|||
*/
|
||||
list_for_each_entry(r, &ops->rules_list, list) {
|
||||
if (r->action == FR_ACT_GOTO &&
|
||||
r->target == rule->pref) {
|
||||
BUG_ON(rtnl_dereference(r->ctarget) != NULL);
|
||||
r->target == rule->pref &&
|
||||
rtnl_dereference(r->ctarget) == NULL) {
|
||||
rcu_assign_pointer(r->ctarget, rule);
|
||||
if (--ops->unresolved_rules == 0)
|
||||
break;
|
||||
|
|
|
@ -374,8 +374,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
|
|||
"%s(): cannot allocate memory for statistics; dev=%s.\n",
|
||||
__func__, dev->name));
|
||||
neigh_parms_release(&nd_tbl, ndev->nd_parms);
|
||||
ndev->dead = 1;
|
||||
in6_dev_finish_destroy(ndev);
|
||||
dev_put(dev);
|
||||
kfree(ndev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -852,6 +852,7 @@ static void handle_channel(struct wiphy *wiphy,
|
|||
return;
|
||||
}
|
||||
|
||||
chan->beacon_found = false;
|
||||
chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
|
||||
chan->max_antenna_gain = min(chan->orig_mag,
|
||||
(int) MBI_TO_DBI(power_rule->max_antenna_gain));
|
||||
|
|
|
@ -118,6 +118,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
|
|||
i++, j++)
|
||||
request->channels[i] =
|
||||
&wdev->wiphy->bands[band]->channels[j];
|
||||
request->rates[band] =
|
||||
(1 << wdev->wiphy->bands[band]->n_bitrates) - 1;
|
||||
}
|
||||
}
|
||||
request->n_channels = n_channels;
|
||||
|
|
|
@ -212,6 +212,11 @@ resume:
|
|||
/* only the first xfrm gets the encap type */
|
||||
encap_type = 0;
|
||||
|
||||
if (async && x->repl->check(x, skb, seq)) {
|
||||
XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
|
||||
goto drop_unlock;
|
||||
}
|
||||
|
||||
x->repl->advance(x, seq);
|
||||
|
||||
x->curlft.bytes += skb->len;
|
||||
|
|
Loading…
Reference in New Issue