提交 e5b26a88 编写于 作者: L Linus Torvalds

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
  ...
...@@ -72,9 +72,15 @@ static struct usb_device_id btusb_table[] = { ...@@ -72,9 +72,15 @@ static struct usb_device_id btusb_table[] = {
/* Apple MacBookAir3,1, MacBookAir3,2 */ /* Apple MacBookAir3,1, MacBookAir3,2 */
{ USB_DEVICE(0x05ac, 0x821b) }, { USB_DEVICE(0x05ac, 0x821b) },
/* Apple MacBookAir4,1 */
{ USB_DEVICE(0x05ac, 0x821f) },
/* Apple MacBookPro8,2 */ /* Apple MacBookPro8,2 */
{ USB_DEVICE(0x05ac, 0x821a) }, { USB_DEVICE(0x05ac, 0x821a) },
/* Apple MacMini5,1 */
{ USB_DEVICE(0x05ac, 0x8281) },
/* AVM BlueFRITZ! USB v2.0 */ /* AVM BlueFRITZ! USB v2.0 */
{ USB_DEVICE(0x057c, 0x3800) }, { USB_DEVICE(0x057c, 0x3800) },
......
...@@ -124,6 +124,13 @@ static long st_receive(void *priv_data, struct sk_buff *skb) ...@@ -124,6 +124,13 @@ static long st_receive(void *priv_data, struct sk_buff *skb)
/* ------- Interfaces to HCI layer ------ */ /* ------- Interfaces to HCI layer ------ */
/* protocol structure registered with shared transport */ /* protocol structure registered with shared transport */
static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = { 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 */ .chnl_id = HCI_ACLDATA_PKT, /* ACL */
.hdr_len = sizeof(struct hci_acl_hdr), .hdr_len = sizeof(struct hci_acl_hdr),
...@@ -138,13 +145,6 @@ static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = { ...@@ -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 */ .len_size = 1, /* sizeof(dlen) in struct hci_sco_hdr */
.reserve = 8, .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 */ /* Called from HCI core to initialize the device */
...@@ -240,7 +240,7 @@ static int ti_st_close(struct hci_dev *hdev) ...@@ -240,7 +240,7 @@ static int ti_st_close(struct hci_dev *hdev)
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; 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]); err = st_unregister(&ti_st_proto[i]);
if (err) if (err)
BT_ERR("st_unregister(%d) failed with error %d", BT_ERR("st_unregister(%d) failed with error %d",
......
...@@ -1669,10 +1669,10 @@ static int gfar_get_cls_all(struct gfar_private *priv, ...@@ -1669,10 +1669,10 @@ static int gfar_get_cls_all(struct gfar_private *priv,
u32 i = 0; u32 i = 0;
list_for_each_entry(comp, &priv->rx_list.list, list) { list_for_each_entry(comp, &priv->rx_list.list, list) {
if (i <= cmd->rule_cnt) { if (i == cmd->rule_cnt)
rule_locs[i] = comp->fs.location; return -EMSGSIZE;
i++; rule_locs[i] = comp->fs.location;
} i++;
} }
cmd->data = MAX_FILER_IDX; cmd->data = MAX_FILER_IDX;
......
...@@ -428,6 +428,7 @@ greth_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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); 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); 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 */ /* Wrap around descriptor ring */
if (greth->tx_next == GRETH_TXBD_NUM_MASK) { if (greth->tx_next == GRETH_TXBD_NUM_MASK) {
...@@ -490,7 +491,8 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev) ...@@ -490,7 +491,8 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
if (nr_frags != 0) if (nr_frags != 0)
status = GRETH_TXBD_MORE; 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; status |= skb_headlen(skb) & GRETH_BD_LEN;
if (greth->tx_next == GRETH_TXBD_NUM_MASK) if (greth->tx_next == GRETH_TXBD_NUM_MASK)
status |= GRETH_BD_WR; status |= GRETH_BD_WR;
...@@ -513,7 +515,9 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev) ...@@ -513,7 +515,9 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
greth->tx_skbuff[curr_tx] = NULL; greth->tx_skbuff[curr_tx] = NULL;
bdp = greth->tx_bd_base + curr_tx; 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; status |= frag->size & GRETH_BD_LEN;
/* Wrap around descriptor ring */ /* Wrap around descriptor ring */
...@@ -641,6 +645,7 @@ static void greth_clean_tx(struct net_device *dev) ...@@ -641,6 +645,7 @@ static void greth_clean_tx(struct net_device *dev)
dev->stats.tx_fifo_errors++; dev->stats.tx_fifo_errors++;
} }
dev->stats.tx_packets++; 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_last = NEXT_TX(greth->tx_last);
greth->tx_free++; greth->tx_free++;
} }
...@@ -695,6 +700,7 @@ static void greth_clean_tx_gbit(struct net_device *dev) ...@@ -695,6 +700,7 @@ static void greth_clean_tx_gbit(struct net_device *dev)
greth->tx_skbuff[greth->tx_last] = NULL; greth->tx_skbuff[greth->tx_last] = NULL;
greth_update_tx_stats(dev, stat); greth_update_tx_stats(dev, stat);
dev->stats.tx_bytes += skb->len;
bdp = greth->tx_bd_base + greth->tx_last; bdp = greth->tx_bd_base + greth->tx_last;
...@@ -796,6 +802,7 @@ static int greth_rx(struct net_device *dev, int limit) ...@@ -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); memcpy(skb_put(skb, pkt_len), phys_to_virt(dma_addr), pkt_len);
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
dev->stats.rx_bytes += pkt_len;
dev->stats.rx_packets++; dev->stats.rx_packets++;
netif_receive_skb(skb); netif_receive_skb(skb);
} }
...@@ -910,6 +917,7 @@ static int greth_rx_gbit(struct net_device *dev, int limit) ...@@ -910,6 +917,7 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
dev->stats.rx_packets++; dev->stats.rx_packets++;
dev->stats.rx_bytes += pkt_len;
netif_receive_skb(skb); netif_receive_skb(skb);
greth->rx_skbuff[greth->rx_cur] = newskb; greth->rx_skbuff[greth->rx_cur] = newskb;
......
...@@ -103,6 +103,7 @@ struct greth_private { ...@@ -103,6 +103,7 @@ struct greth_private {
unsigned char *tx_bufs[GRETH_TXBD_NUM]; unsigned char *tx_bufs[GRETH_TXBD_NUM];
unsigned char *rx_bufs[GRETH_RXBD_NUM]; unsigned char *rx_bufs[GRETH_RXBD_NUM];
u16 tx_bufs_length[GRETH_TXBD_NUM];
u16 tx_next; u16 tx_next;
u16 tx_last; u16 tx_last;
......
...@@ -1321,8 +1321,8 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, ...@@ -1321,8 +1321,8 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
if (ring_is_rsc_enabled(rx_ring)) if (ring_is_rsc_enabled(rx_ring))
pkt_is_rsc = ixgbe_get_rsc_state(rx_desc); pkt_is_rsc = ixgbe_get_rsc_state(rx_desc);
/* if this is a skb from previous receive DMA will be 0 */ /* linear means we are building an skb from multiple pages */
if (rx_buffer_info->dma) { if (!skb_is_nonlinear(skb)) {
u16 hlen; u16 hlen;
if (pkt_is_rsc && if (pkt_is_rsc &&
!(staterr & IXGBE_RXD_STAT_EOP) && !(staterr & IXGBE_RXD_STAT_EOP) &&
......
...@@ -799,5 +799,11 @@ static void __exit cleanup_netconsole(void) ...@@ -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); module_exit(cleanup_netconsole);
...@@ -1465,7 +1465,12 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) ...@@ -1465,7 +1465,12 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
continue; 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) if (mtu < 4)
mtu = 4; mtu = 4;
if (flen > mtu) if (flen > mtu)
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/types.h> #include <linux/types.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/system.h> #include <asm/system.h>
......
...@@ -407,6 +407,7 @@ enum rtl_register_content { ...@@ -407,6 +407,7 @@ enum rtl_register_content {
RxOK = 0x0001, RxOK = 0x0001,
/* RxStatusDesc */ /* RxStatusDesc */
RxBOVF = (1 << 24),
RxFOVF = (1 << 23), RxFOVF = (1 << 23),
RxRWT = (1 << 22), RxRWT = (1 << 22),
RxRES = (1 << 21), RxRES = (1 << 21),
...@@ -682,6 +683,7 @@ struct rtl8169_private { ...@@ -682,6 +683,7 @@ struct rtl8169_private {
struct mii_if_info mii; struct mii_if_info mii;
struct rtl8169_counters counters; struct rtl8169_counters counters;
u32 saved_wolopts; u32 saved_wolopts;
u32 opts1_mask;
struct rtl_fw { struct rtl_fw {
const struct firmware *fw; const struct firmware *fw;
...@@ -710,6 +712,7 @@ MODULE_FIRMWARE(FIRMWARE_8168D_1); ...@@ -710,6 +712,7 @@ MODULE_FIRMWARE(FIRMWARE_8168D_1);
MODULE_FIRMWARE(FIRMWARE_8168D_2); MODULE_FIRMWARE(FIRMWARE_8168D_2);
MODULE_FIRMWARE(FIRMWARE_8168E_1); MODULE_FIRMWARE(FIRMWARE_8168E_1);
MODULE_FIRMWARE(FIRMWARE_8168E_2); MODULE_FIRMWARE(FIRMWARE_8168E_2);
MODULE_FIRMWARE(FIRMWARE_8168E_3);
MODULE_FIRMWARE(FIRMWARE_8105E_1); MODULE_FIRMWARE(FIRMWARE_8105E_1);
static int rtl8169_open(struct net_device *dev); static int rtl8169_open(struct net_device *dev);
...@@ -3077,6 +3080,14 @@ static void rtl8169_phy_reset(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"); 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) static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
...@@ -3109,7 +3120,7 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp) ...@@ -3109,7 +3120,7 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Half |
ADVERTISED_1000baseT_Full : 0)); ADVERTISED_1000baseT_Full : 0));
if (RTL_R8(PHYstatus) & TBI_Enable) if (rtl_tbi_enabled(tp))
netif_info(tp, link, dev, "TBI auto-negotiating\n"); netif_info(tp, link, dev, "TBI auto-negotiating\n");
} }
...@@ -3319,9 +3330,16 @@ static void r810x_phy_power_up(struct rtl8169_private *tp) ...@@ -3319,9 +3330,16 @@ static void r810x_phy_power_up(struct rtl8169_private *tp)
static void r810x_pll_power_down(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) { if (__rtl8169_get_wol(tp) & WAKE_ANY) {
rtl_writephy(tp, 0x1f, 0x0000); rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, MII_BMCR, 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; return;
} }
...@@ -3417,7 +3435,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp) ...@@ -3417,7 +3435,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
rtl_writephy(tp, MII_BMCR, 0x0000); rtl_writephy(tp, MII_BMCR, 0x0000);
if (tp->mac_version == RTL_GIGA_MAC_VER_32 || 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 | RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast |
AcceptMulticast | AcceptMyPhys); AcceptMulticast | AcceptMyPhys);
return; return;
...@@ -3727,8 +3746,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -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); tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
RTL_W8(Cfg9346, Cfg9346_Lock); RTL_W8(Cfg9346, Cfg9346_Lock);
if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) && if (rtl_tbi_enabled(tp)) {
(RTL_R8(PHYstatus) & TBI_Enable)) {
tp->set_speed = rtl8169_set_speed_tbi; tp->set_speed = rtl8169_set_speed_tbi;
tp->get_settings = rtl8169_gset_tbi; tp->get_settings = rtl8169_gset_tbi;
tp->phy_reset_enable = rtl8169_tbi_reset_enable; 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) ...@@ -3777,6 +3795,9 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
tp->intr_event = cfg->intr_event; tp->intr_event = cfg->intr_event;
tp->napi_event = cfg->napi_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); init_timer(&tp->timer);
tp->timer.data = (unsigned long) dev; tp->timer.data = (unsigned long) dev;
tp->timer.function = rtl8169_phy_timer; tp->timer.function = rtl8169_phy_timer;
...@@ -3988,6 +4009,7 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp) ...@@ -3988,6 +4009,7 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
while (RTL_R8(TxPoll) & NPQ) while (RTL_R8(TxPoll) & NPQ)
udelay(20); udelay(20);
} else if (tp->mac_version == RTL_GIGA_MAC_VER_34) { } else if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
while (!(RTL_R32(TxConfig) & TXCFG_EMPTY)) while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
udelay(100); udelay(100);
} else { } else {
...@@ -5314,7 +5336,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev, ...@@ -5314,7 +5336,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
u32 status; u32 status;
rmb(); rmb();
status = le32_to_cpu(desc->opts1); status = le32_to_cpu(desc->opts1) & tp->opts1_mask;
if (status & DescOwn) if (status & DescOwn)
break; break;
......
...@@ -6234,12 +6234,10 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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)) { if (vlan_tx_tag_present(skb)) {
base_flags |= TXD_FLAG_VLAN; base_flags |= TXD_FLAG_VLAN;
vlan = vlan_tx_tag_get(skb); vlan = vlan_tx_tag_get(skb);
} }
#endif
if (tg3_flag(tp, USE_JUMBO_BDFLAG) && if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
!mss && skb->len > VLAN_ETH_FRAME_LEN) !mss && skb->len > VLAN_ETH_FRAME_LEN)
......
...@@ -1632,7 +1632,8 @@ static void handle_irq_beacon(struct b43_wldev *dev) ...@@ -1632,7 +1632,8 @@ static void handle_irq_beacon(struct b43_wldev *dev)
u32 cmd, beacon0_valid, beacon1_valid; u32 cmd, beacon0_valid, beacon1_valid;
if (!b43_is_mode(wl, NL80211_IFTYPE_AP) && 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; return;
/* This is the bottom half of the asynchronous beacon update. */ /* This is the bottom half of the asynchronous beacon update. */
......
...@@ -1901,17 +1901,19 @@ static void ipw2100_down(struct ipw2100_priv *priv) ...@@ -1901,17 +1901,19 @@ static void ipw2100_down(struct ipw2100_priv *priv)
/* Called by register_netdev() */ /* Called by register_netdev() */
static int ipw2100_net_init(struct net_device *dev) 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); struct ipw2100_priv *priv = libipw_priv(dev);
const struct libipw_geo *geo = libipw_get_geo(priv->ieee); const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
struct wireless_dev *wdev = &priv->ieee->wdev; struct wireless_dev *wdev = &priv->ieee->wdev;
int ret;
int i; int i;
ret = ipw2100_up(priv, 1);
if (ret)
return ret;
memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
/* fill-out priv->ieee->bg_band */ /* fill-out priv->ieee->bg_band */
...@@ -6350,9 +6352,13 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, ...@@ -6350,9 +6352,13 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
"Error calling register_netdev.\n"); "Error calling register_netdev.\n");
goto fail; goto fail;
} }
registered = 1;
err = ipw2100_wdev_init(dev);
if (err)
goto fail;
mutex_lock(&priv->action_mutex); mutex_lock(&priv->action_mutex);
registered = 1;
IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); 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, ...@@ -6389,7 +6395,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
fail_unlock: fail_unlock:
mutex_unlock(&priv->action_mutex); mutex_unlock(&priv->action_mutex);
wiphy_unregister(priv->ieee->wdev.wiphy);
kfree(priv->ieee->bg_band.channels);
fail: fail:
if (dev) { if (dev) {
if (registered) if (registered)
......
...@@ -11424,17 +11424,24 @@ static void ipw_bg_down(struct work_struct *work) ...@@ -11424,17 +11424,24 @@ static void ipw_bg_down(struct work_struct *work)
/* Called by register_netdev() */ /* Called by register_netdev() */
static int ipw_net_init(struct net_device *dev) 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; int i, rc = 0;
struct ipw_priv *priv = libipw_priv(dev); struct ipw_priv *priv = libipw_priv(dev);
const struct libipw_geo *geo = libipw_get_geo(priv->ieee); const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
struct wireless_dev *wdev = &priv->ieee->wdev; 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); memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
...@@ -11519,13 +11526,9 @@ static int ipw_net_init(struct net_device *dev) ...@@ -11519,13 +11526,9 @@ static int ipw_net_init(struct net_device *dev)
set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
/* With that information in place, we can now register the wiphy... */ /* With that information in place, we can now register the wiphy... */
if (wiphy_register(wdev->wiphy)) { if (wiphy_register(wdev->wiphy))
rc = -EIO; rc = -EIO;
goto out;
}
out: out:
mutex_unlock(&priv->mutex);
return rc; return rc;
} }
...@@ -11832,14 +11835,22 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, ...@@ -11832,14 +11835,22 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
goto out_remove_sysfs; 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 #ifdef CONFIG_IPW2200_PROMISCUOUS
if (rtap_iface) { if (rtap_iface) {
err = ipw_prom_alloc(priv); err = ipw_prom_alloc(priv);
if (err) { if (err) {
IPW_ERROR("Failed to register promiscuous network " IPW_ERROR("Failed to register promiscuous network "
"device (error %d).\n", err); "device (error %d).\n", err);
unregister_netdev(priv->net_dev); wiphy_unregister(priv->ieee->wdev.wiphy);
goto out_remove_sysfs; kfree(priv->ieee->a_band.channels);
kfree(priv->ieee->bg_band.channels);
goto out_unregister_netdev;
} }
} }
#endif #endif
...@@ -11851,6 +11862,8 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, ...@@ -11851,6 +11862,8 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
return 0; return 0;
out_unregister_netdev:
unregister_netdev(priv->net_dev);
out_remove_sysfs: out_remove_sysfs:
sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
out_release_irq: out_release_irq:
......
...@@ -2140,7 +2140,12 @@ static int iwl_mac_setup_register(struct iwl_priv *priv, ...@@ -2140,7 +2140,12 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
IEEE80211_HW_SPECTRUM_MGMT | IEEE80211_HW_SPECTRUM_MGMT |
IEEE80211_HW_REPORTS_TX_ACK_STATUS; 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->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
*/
hw->flags |= IEEE80211_HW_SUPPORTS_PS | hw->flags |= IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_SUPPORTS_DYNAMIC_PS; IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
......
...@@ -3697,14 +3697,15 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i) ...@@ -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, &reg); rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg);
/* Apparently the data is read from end to start */ /* Apparently the data is read from end to start */
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, &reg);
(u32 *)&rt2x00dev->eeprom[i]); /* The returned value is in CPU order, but eeprom is le */
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, rt2x00dev->eeprom[i] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 2]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, &reg);
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, *(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 4]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, &reg);
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, *(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 6]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, &reg);
*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
mutex_unlock(&rt2x00dev->csr_mutex); mutex_unlock(&rt2x00dev->csr_mutex);
} }
...@@ -3870,19 +3871,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) ...@@ -3870,19 +3871,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
return -ENODEV; return -ENODEV;
} }
if (!rt2x00_rf(rt2x00dev, RF2820) && switch (rt2x00dev->chip.rf) {
!rt2x00_rf(rt2x00dev, RF2850) && case RF2820:
!rt2x00_rf(rt2x00dev, RF2720) && case RF2850:
!rt2x00_rf(rt2x00dev, RF2750) && case RF2720:
!rt2x00_rf(rt2x00dev, RF3020) && case RF2750:
!rt2x00_rf(rt2x00dev, RF2020) && case RF3020:
!rt2x00_rf(rt2x00dev, RF3021) && case RF2020:
!rt2x00_rf(rt2x00dev, RF3022) && case RF3021:
!rt2x00_rf(rt2x00dev, RF3052) && case RF3022:
!rt2x00_rf(rt2x00dev, RF3320) && case RF3052:
!rt2x00_rf(rt2x00dev, RF5370) && case RF3320:
!rt2x00_rf(rt2x00dev, RF5390)) { case RF5370:
ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); case RF5390:
break;
default:
ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
rt2x00dev->chip.rf);
return -ENODEV; return -ENODEV;
} }
......
...@@ -58,8 +58,8 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -58,8 +58,8 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
if (status) if (status)
return; return;
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); 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) ...@@ -76,8 +76,8 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
if (status) if (status)
return; return;
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_conn_check_pending(hdev); hci_conn_check_pending(hdev);
...@@ -959,9 +959,8 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) ...@@ -959,9 +959,8 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
return; return;
} }
if (test_bit(HCI_MGMT, &hdev->flags) && if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags) &&
!test_and_set_bit(HCI_INQUIRY, test_bit(HCI_MGMT, &hdev->flags))
&hdev->flags))
mgmt_discovering(hdev->id, 1); mgmt_discovering(hdev->id, 1);
} }
...@@ -1340,8 +1339,8 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff ...@@ -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); BT_DBG("%s status %d", hdev->name, status);
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_req_complete(hdev, HCI_OP_INQUIRY, status); 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) ...@@ -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) { list_for_each_entry(r, &ops->rules_list, list) {
if (r->action == FR_ACT_GOTO && if (r->action == FR_ACT_GOTO &&
r->target == rule->pref) { r->target == rule->pref &&
BUG_ON(rtnl_dereference(r->ctarget) != NULL); rtnl_dereference(r->ctarget) == NULL) {
rcu_assign_pointer(r->ctarget, rule); rcu_assign_pointer(r->ctarget, rule);
if (--ops->unresolved_rules == 0) if (--ops->unresolved_rules == 0)
break; break;
......
...@@ -374,8 +374,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) ...@@ -374,8 +374,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
"%s(): cannot allocate memory for statistics; dev=%s.\n", "%s(): cannot allocate memory for statistics; dev=%s.\n",
__func__, dev->name)); __func__, dev->name));
neigh_parms_release(&nd_tbl, ndev->nd_parms); neigh_parms_release(&nd_tbl, ndev->nd_parms);
ndev->dead = 1; dev_put(dev);
in6_dev_finish_destroy(ndev); kfree(ndev);
return NULL; return NULL;
} }
......
...@@ -852,6 +852,7 @@ static void handle_channel(struct wiphy *wiphy, ...@@ -852,6 +852,7 @@ static void handle_channel(struct wiphy *wiphy,
return; return;
} }
chan->beacon_found = false;
chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags); chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
chan->max_antenna_gain = min(chan->orig_mag, chan->max_antenna_gain = min(chan->orig_mag,
(int) MBI_TO_DBI(power_rule->max_antenna_gain)); (int) MBI_TO_DBI(power_rule->max_antenna_gain));
......
...@@ -118,6 +118,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev) ...@@ -118,6 +118,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
i++, j++) i++, j++)
request->channels[i] = request->channels[i] =
&wdev->wiphy->bands[band]->channels[j]; &wdev->wiphy->bands[band]->channels[j];
request->rates[band] =
(1 << wdev->wiphy->bands[band]->n_bitrates) - 1;
} }
} }
request->n_channels = n_channels; request->n_channels = n_channels;
......
...@@ -212,6 +212,11 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) ...@@ -212,6 +212,11 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
/* only the first xfrm gets the encap type */ /* only the first xfrm gets the encap type */
encap_type = 0; 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->repl->advance(x, seq);
x->curlft.bytes += skb->len; x->curlft.bytes += skb->len;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册