Commit db9d8c60 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking updates from David Miller:

 1) inet6_csk_update_pmtu() must return NULL or non-NULL, so translate
    ERR_PTR to NULL, as needed.  Fix from Eric Dumazet.

 2) Fix copy&paste error in IRDA sir_dev ->set_speed method invocation,
    it was testing the NULL'ness of a different method to guard the
    call.  Fix from Alexander Shiyan.

 3) Fix build regression of xilinx driver, from Jeff Mahoney.

 4) Make XEN netfront (like XEN netback) handle compound pages in SKBs
    properly.  From Ian Campbell.

 5) Fix inverted logic of team_dev_queue_xmit() return value checks,
    from Jiri Pirko and Dan Carpenter.

 6) dma_poll_create() no longer allows a NULL device argument, breaking
    both ixp4xx drivers.  Fix from Xi Wang.

 7) ne2000 driver doesn't hook up the parent device properly, breaking
    udev matching.  Fix from Alan Cox.

 8) Locking and memory leak fixes in Near Field Communications layer.
    From Thierry Escande, Szymon Janc, and Waldemar Rymarkiewicz.

 9) sis900 resume regression, sis900_set_mode() is being called with the
    iomem pointer instead of the expected device private.  Fix from
    Francois Romieu.

10) Fix IBSS regression caused by uninitializing the ibss-internals
    before performing an emptyness check, from Simon WUnderlich.

11) Fix SNIFFER mode regression in iwlwifi driver, from Johannes Berg.

12) Fix task wedges in mwifiex_cmd_timeout_func(), from Bing Zhao.

13) Add back wireless sysfs directory, too much stuff depends upon it
    being there (actually I'd say it never should have been removed to
    begin with).  From Johannes Berg.

14) Fix hang introduced by suspend/resume changes in ath9k.  Fix from
    Sujith Manoharan.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (24 commits)
  team: bcast: convert return value of team_dev_queue_xmit() to bool correctly
  bonding: Bonding driver does not consider the gso_max_size/gso_max_segs setting of slave devices.
  xen/netfront: handle compound page fragments on transmit
  net: fix build failure in xilinx
  irda: sir_dev: Fix copy/paste typo
  ipv6: fix inet6_csk_update_pmtu() return value
  ixp4xx_hss: avoid calling dma_pool_create() with NULL dev
  ixp4xx_eth: avoid calling dma_pool_create() with NULL dev
  ne2000: add the right platform device
  of/net/mdio-gpio: Fix pdev->id issue when using devicetrees.
  NFC: Fix pn533 target mode memory leak
  NFC: pn533: Fix mem leak in pn533_in_dep_link_up
  NFC: pn533: Fix use after free
  NFC: pn533: Fix missing lock while operating on commands list
  NFC: Fix nfc_llcp_local chained list insertion
  ath9k_hw: Fix regression in device reset
  sis900: fix sis900_set_mode call parameters.
  iwlwifi: don't WARN when a non empty queue is disabled
  wireless: add back sysfs directory
  mwifiex: report error to MMC core if we cannot suspend
  ...
parents 45e77159 403f43c9
...@@ -8,9 +8,16 @@ gpios property as described in section VIII.1 in the following order: ...@@ -8,9 +8,16 @@ gpios property as described in section VIII.1 in the following order:
MDC, MDIO. MDC, MDIO.
Note: Each gpio-mdio bus should have an alias correctly numbered in "aliases"
node.
Example: Example:
mdio { aliases {
mdio-gpio0 = <&mdio0>;
};
mdio0: mdio {
compatible = "virtual,mdio-gpio"; compatible = "virtual,mdio-gpio";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
......
...@@ -1379,6 +1379,8 @@ static void bond_compute_features(struct bonding *bond) ...@@ -1379,6 +1379,8 @@ static void bond_compute_features(struct bonding *bond)
struct net_device *bond_dev = bond->dev; struct net_device *bond_dev = bond->dev;
netdev_features_t vlan_features = BOND_VLAN_FEATURES; netdev_features_t vlan_features = BOND_VLAN_FEATURES;
unsigned short max_hard_header_len = ETH_HLEN; unsigned short max_hard_header_len = ETH_HLEN;
unsigned int gso_max_size = GSO_MAX_SIZE;
u16 gso_max_segs = GSO_MAX_SEGS;
int i; int i;
unsigned int flags, dst_release_flag = IFF_XMIT_DST_RELEASE; unsigned int flags, dst_release_flag = IFF_XMIT_DST_RELEASE;
...@@ -1394,11 +1396,16 @@ static void bond_compute_features(struct bonding *bond) ...@@ -1394,11 +1396,16 @@ static void bond_compute_features(struct bonding *bond)
dst_release_flag &= slave->dev->priv_flags; dst_release_flag &= slave->dev->priv_flags;
if (slave->dev->hard_header_len > max_hard_header_len) if (slave->dev->hard_header_len > max_hard_header_len)
max_hard_header_len = slave->dev->hard_header_len; max_hard_header_len = slave->dev->hard_header_len;
gso_max_size = min(gso_max_size, slave->dev->gso_max_size);
gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs);
} }
done: done:
bond_dev->vlan_features = vlan_features; bond_dev->vlan_features = vlan_features;
bond_dev->hard_header_len = max_hard_header_len; bond_dev->hard_header_len = max_hard_header_len;
bond_dev->gso_max_segs = gso_max_segs;
netif_set_gso_max_size(bond_dev, gso_max_size);
flags = bond_dev->priv_flags & ~IFF_XMIT_DST_RELEASE; flags = bond_dev->priv_flags & ~IFF_XMIT_DST_RELEASE;
bond_dev->priv_flags = flags | dst_release_flag; bond_dev->priv_flags = flags | dst_release_flag;
......
...@@ -813,6 +813,7 @@ static int __init ne_drv_probe(struct platform_device *pdev) ...@@ -813,6 +813,7 @@ static int __init ne_drv_probe(struct platform_device *pdev)
dev->irq = irq[this_dev]; dev->irq = irq[this_dev];
dev->mem_end = bad[this_dev]; dev->mem_end = bad[this_dev];
} }
SET_NETDEV_DEV(dev, &pdev->dev);
err = do_ne_probe(dev); err = do_ne_probe(dev);
if (err) { if (err) {
free_netdev(dev); free_netdev(dev);
......
...@@ -2479,7 +2479,7 @@ static int sis900_resume(struct pci_dev *pci_dev) ...@@ -2479,7 +2479,7 @@ static int sis900_resume(struct pci_dev *pci_dev)
netif_start_queue(net_dev); netif_start_queue(net_dev);
/* Workaround for EDB */ /* Workaround for EDB */
sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
/* Enable all known interrupts by setting the interrupt mask. */ /* Enable all known interrupts by setting the interrupt mask. */
sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE);
......
...@@ -894,6 +894,8 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev) ...@@ -894,6 +894,8 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void axienet_dma_err_handler(unsigned long data);
/** /**
* axienet_open - Driver open routine. * axienet_open - Driver open routine.
* @ndev: Pointer to net_device structure * @ndev: Pointer to net_device structure
......
...@@ -1102,10 +1102,12 @@ static int init_queues(struct port *port) ...@@ -1102,10 +1102,12 @@ static int init_queues(struct port *port)
{ {
int i; int i;
if (!ports_open) if (!ports_open) {
if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, dma_pool = dma_pool_create(DRV_NAME, &port->netdev->dev,
POOL_ALLOC_SIZE, 32, 0))) POOL_ALLOC_SIZE, 32, 0);
if (!dma_pool)
return -ENOMEM; return -ENOMEM;
}
if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL,
&port->desc_tab_phys))) &port->desc_tab_phys)))
......
...@@ -222,7 +222,7 @@ static void sirdev_config_fsm(struct work_struct *work) ...@@ -222,7 +222,7 @@ static void sirdev_config_fsm(struct work_struct *work)
break; break;
case SIRDEV_STATE_DONGLE_SPEED: case SIRDEV_STATE_DONGLE_SPEED:
if (dev->dongle_drv->reset) { if (dev->dongle_drv->set_speed) {
ret = dev->dongle_drv->set_speed(dev, fsm->param); ret = dev->dongle_drv->set_speed(dev, fsm->param);
if (ret < 0) { if (ret < 0) {
fsm->result = ret; fsm->result = ret;
......
...@@ -185,17 +185,20 @@ static int __devinit mdio_gpio_probe(struct platform_device *pdev) ...@@ -185,17 +185,20 @@ static int __devinit mdio_gpio_probe(struct platform_device *pdev)
{ {
struct mdio_gpio_platform_data *pdata; struct mdio_gpio_platform_data *pdata;
struct mii_bus *new_bus; struct mii_bus *new_bus;
int ret; int ret, bus_id;
if (pdev->dev.of_node) if (pdev->dev.of_node) {
pdata = mdio_gpio_of_get_data(pdev); pdata = mdio_gpio_of_get_data(pdev);
else bus_id = of_alias_get_id(pdev->dev.of_node, "mdio-gpio");
} else {
pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
bus_id = pdev->id;
}
if (!pdata) if (!pdata)
return -ENODEV; return -ENODEV;
new_bus = mdio_gpio_bus_init(&pdev->dev, pdata, pdev->id); new_bus = mdio_gpio_bus_init(&pdev->dev, pdata, bus_id);
if (!new_bus) if (!new_bus)
return -ENODEV; return -ENODEV;
......
...@@ -29,8 +29,8 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb) ...@@ -29,8 +29,8 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb)
if (last) { if (last) {
skb2 = skb_clone(skb, GFP_ATOMIC); skb2 = skb_clone(skb, GFP_ATOMIC);
if (skb2) { if (skb2) {
ret = team_dev_queue_xmit(team, last, ret = !team_dev_queue_xmit(team, last,
skb2); skb2);
if (!sum_ret) if (!sum_ret)
sum_ret = ret; sum_ret = ret;
} }
...@@ -39,7 +39,7 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb) ...@@ -39,7 +39,7 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb)
} }
} }
if (last) { if (last) {
ret = team_dev_queue_xmit(team, last, skb); ret = !team_dev_queue_xmit(team, last, skb);
if (!sum_ret) if (!sum_ret)
sum_ret = ret; sum_ret = ret;
} }
......
...@@ -969,10 +969,12 @@ static int init_hdlc_queues(struct port *port) ...@@ -969,10 +969,12 @@ static int init_hdlc_queues(struct port *port)
{ {
int i; int i;
if (!ports_open) if (!ports_open) {
if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, dma_pool = dma_pool_create(DRV_NAME, &port->netdev->dev,
POOL_ALLOC_SIZE, 32, 0))) POOL_ALLOC_SIZE, 32, 0);
if (!dma_pool)
return -ENOMEM; return -ENOMEM;
}
if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL,
&port->desc_tab_phys))) &port->desc_tab_phys)))
......
...@@ -1456,7 +1456,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) ...@@ -1456,7 +1456,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
switch (type) { switch (type) {
case ATH9K_RESET_POWER_ON: case ATH9K_RESET_POWER_ON:
ret = ath9k_hw_set_reset_power_on(ah); ret = ath9k_hw_set_reset_power_on(ah);
if (!ret) if (ret)
ah->reset_power_on = true; ah->reset_power_on = true;
break; break;
case ATH9K_RESET_WARM: case ATH9K_RESET_WARM:
......
...@@ -1354,6 +1354,20 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw, ...@@ -1354,6 +1354,20 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
vif_priv->ctx = ctx; vif_priv->ctx = ctx;
ctx->vif = vif; ctx->vif = vif;
/*
* In SNIFFER device type, the firmware reports the FCS to
* the host, rather than snipping it off. Unfortunately,
* mac80211 doesn't (yet) provide a per-packet flag for
* this, so that we have to set the hardware flag based
* on the interfaces added. As the monitor interface can
* only be present by itself, and will be removed before
* other interfaces are added, this is safe.
*/
if (vif->type == NL80211_IFTYPE_MONITOR)
priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS;
else
priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS;
err = iwl_setup_interface(priv, ctx); err = iwl_setup_interface(priv, ctx);
if (!err || reset) if (!err || reset)
goto out; goto out;
......
...@@ -480,20 +480,12 @@ void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, ...@@ -480,20 +480,12 @@ void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo,
void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id)
{ {
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
u16 rd_ptr, wr_ptr;
int n_bd = trans_pcie->txq[txq_id].q.n_bd;
if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) { if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) {
WARN_ONCE(1, "queue %d not used", txq_id); WARN_ONCE(1, "queue %d not used", txq_id);
return; return;
} }
rd_ptr = iwl_read_prph(trans, SCD_QUEUE_RDPTR(txq_id)) & (n_bd - 1);
wr_ptr = iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq_id));
WARN_ONCE(rd_ptr != wr_ptr, "queue %d isn't empty: [%d,%d]",
txq_id, rd_ptr, wr_ptr);
iwl_txq_set_inactive(trans, txq_id); iwl_txq_set_inactive(trans, txq_id);
IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id);
} }
......
...@@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context) ...@@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
return; return;
} }
cmd_node = adapter->curr_cmd; cmd_node = adapter->curr_cmd;
if (cmd_node->wait_q_enabled)
adapter->cmd_wait_q.status = -ETIMEDOUT;
if (cmd_node) { if (cmd_node) {
adapter->dbg.timeout_cmd_id = adapter->dbg.timeout_cmd_id =
adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index]; adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index];
...@@ -938,6 +935,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context) ...@@ -938,6 +935,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n", dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n",
adapter->ps_mode, adapter->ps_state); adapter->ps_mode, adapter->ps_state);
if (cmd_node->wait_q_enabled) {
adapter->cmd_wait_q.status = -ETIMEDOUT;
wake_up_interruptible(&adapter->cmd_wait_q.wait);
mwifiex_cancel_pending_ioctl(adapter);
/* reset cmd_sent flag to unblock new commands */
adapter->cmd_sent = false;
}
} }
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING)
mwifiex_init_fw_complete(adapter); mwifiex_init_fw_complete(adapter);
......
...@@ -161,7 +161,6 @@ static int mwifiex_sdio_suspend(struct device *dev) ...@@ -161,7 +161,6 @@ static int mwifiex_sdio_suspend(struct device *dev)
struct sdio_mmc_card *card; struct sdio_mmc_card *card;
struct mwifiex_adapter *adapter; struct mwifiex_adapter *adapter;
mmc_pm_flag_t pm_flag = 0; mmc_pm_flag_t pm_flag = 0;
int hs_actived = 0;
int i; int i;
int ret = 0; int ret = 0;
...@@ -188,12 +187,14 @@ static int mwifiex_sdio_suspend(struct device *dev) ...@@ -188,12 +187,14 @@ static int mwifiex_sdio_suspend(struct device *dev)
adapter = card->adapter; adapter = card->adapter;
/* Enable the Host Sleep */ /* Enable the Host Sleep */
hs_actived = mwifiex_enable_hs(adapter); if (!mwifiex_enable_hs(adapter)) {
if (hs_actived) { dev_err(adapter->dev, "cmd: failed to suspend\n");
pr_debug("cmd: suspend with MMC_PM_KEEP_POWER\n"); return -EFAULT;
ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
} }
dev_dbg(adapter->dev, "cmd: suspend with MMC_PM_KEEP_POWER\n");
ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
/* Indicate device suspended */ /* Indicate device suspended */
adapter->is_suspended = true; adapter->is_suspended = true;
......
...@@ -297,6 +297,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { ...@@ -297,6 +297,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
/*=== Customer ID ===*/ /*=== Customer ID ===*/
/****** 8188CU ********/ /****** 8188CU ********/
{RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/ {RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/
{RTL_USB_DEVICE(0x050d, 0x11f2, rtl92cu_hal_cfg)}, /*Belkin - ISY*/
{RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/
{RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/
{RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/
......
...@@ -452,29 +452,85 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev, ...@@ -452,29 +452,85 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
/* Grant backend access to each skb fragment page. */ /* Grant backend access to each skb fragment page. */
for (i = 0; i < frags; i++) { for (i = 0; i < frags; i++) {
skb_frag_t *frag = skb_shinfo(skb)->frags + i; skb_frag_t *frag = skb_shinfo(skb)->frags + i;
struct page *page = skb_frag_page(frag);
tx->flags |= XEN_NETTXF_more_data; len = skb_frag_size(frag);
offset = frag->page_offset;
id = get_id_from_freelist(&np->tx_skb_freelist, np->tx_skbs); /* Data must not cross a page boundary. */
np->tx_skbs[id].skb = skb_get(skb); BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
tx = RING_GET_REQUEST(&np->tx, prod++);
tx->id = id;
ref = gnttab_claim_grant_reference(&np->gref_tx_head);
BUG_ON((signed short)ref < 0);
mfn = pfn_to_mfn(page_to_pfn(skb_frag_page(frag))); /* Skip unused frames from start of page */
gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id, page += offset >> PAGE_SHIFT;
mfn, GNTMAP_readonly); offset &= ~PAGE_MASK;
tx->gref = np->grant_tx_ref[id] = ref; while (len > 0) {
tx->offset = frag->page_offset; unsigned long bytes;
tx->size = skb_frag_size(frag);
tx->flags = 0; BUG_ON(offset >= PAGE_SIZE);
bytes = PAGE_SIZE - offset;
if (bytes > len)
bytes = len;
tx->flags |= XEN_NETTXF_more_data;
id = get_id_from_freelist(&np->tx_skb_freelist,
np->tx_skbs);
np->tx_skbs[id].skb = skb_get(skb);
tx = RING_GET_REQUEST(&np->tx, prod++);
tx->id = id;
ref = gnttab_claim_grant_reference(&np->gref_tx_head);
BUG_ON((signed short)ref < 0);
mfn = pfn_to_mfn(page_to_pfn(page));
gnttab_grant_foreign_access_ref(ref,
np->xbdev->otherend_id,
mfn, GNTMAP_readonly);
tx->gref = np->grant_tx_ref[id] = ref;
tx->offset = offset;
tx->size = bytes;
tx->flags = 0;
offset += bytes;
len -= bytes;
/* Next frame */
if (offset == PAGE_SIZE && len) {
BUG_ON(!PageCompound(page));
page++;
offset = 0;
}
}
} }
np->tx.req_prod_pvt = prod; np->tx.req_prod_pvt = prod;
} }
/*
* Count how many ring slots are required to send the frags of this
* skb. Each frag might be a compound page.
*/
static int xennet_count_skb_frag_slots(struct sk_buff *skb)
{
int i, frags = skb_shinfo(skb)->nr_frags;
int pages = 0;
for (i = 0; i < frags; i++) {
skb_frag_t *frag = skb_shinfo(skb)->frags + i;
unsigned long size = skb_frag_size(frag);
unsigned long offset = frag->page_offset;
/* Skip unused frames from start of page */
offset &= ~PAGE_MASK;
pages += PFN_UP(offset + size);
}
return pages;
}
static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
unsigned short id; unsigned short id;
...@@ -487,23 +543,23 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -487,23 +543,23 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
grant_ref_t ref; grant_ref_t ref;
unsigned long mfn; unsigned long mfn;
int notify; int notify;
int frags = skb_shinfo(skb)->nr_frags; int slots;
unsigned int offset = offset_in_page(data); unsigned int offset = offset_in_page(data);
unsigned int len = skb_headlen(skb); unsigned int len = skb_headlen(skb);
unsigned long flags; unsigned long flags;
frags += DIV_ROUND_UP(offset + len, PAGE_SIZE); slots = DIV_ROUND_UP(offset + len, PAGE_SIZE) +
if (unlikely(frags > MAX_SKB_FRAGS + 1)) { xennet_count_skb_frag_slots(skb);
printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n", if (unlikely(slots > MAX_SKB_FRAGS + 1)) {
frags); net_alert_ratelimited(
dump_stack(); "xennet: skb rides the rocket: %d slots\n", slots);
goto drop; goto drop;
} }
spin_lock_irqsave(&np->tx_lock, flags); spin_lock_irqsave(&np->tx_lock, flags);
if (unlikely(!netif_carrier_ok(dev) || if (unlikely(!netif_carrier_ok(dev) ||
(frags > 1 && !xennet_can_sg(dev)) || (slots > 1 && !xennet_can_sg(dev)) ||
netif_needs_gso(skb, netif_skb_features(skb)))) { netif_needs_gso(skb, netif_skb_features(skb)))) {
spin_unlock_irqrestore(&np->tx_lock, flags); spin_unlock_irqrestore(&np->tx_lock, flags);
goto drop; goto drop;
......
...@@ -698,13 +698,14 @@ static void pn533_wq_cmd(struct work_struct *work) ...@@ -698,13 +698,14 @@ static void pn533_wq_cmd(struct work_struct *work)
cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue); cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue);
list_del(&cmd->queue);
mutex_unlock(&dev->cmd_lock); mutex_unlock(&dev->cmd_lock);
__pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame, __pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame,
cmd->in_frame_len, cmd->cmd_complete, cmd->in_frame_len, cmd->cmd_complete,
cmd->arg, cmd->flags); cmd->arg, cmd->flags);
list_del(&cmd->queue);
kfree(cmd); kfree(cmd);
} }
...@@ -1678,11 +1679,14 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev, ...@@ -1678,11 +1679,14 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev,
static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
u8 *params, int params_len) u8 *params, int params_len)
{ {
struct pn533_cmd_jump_dep *cmd;
struct pn533_cmd_jump_dep_response *resp; struct pn533_cmd_jump_dep_response *resp;
struct nfc_target nfc_target; struct nfc_target nfc_target;
u8 target_gt_len; u8 target_gt_len;
int rc; int rc;
struct pn533_cmd_jump_dep *cmd = (struct pn533_cmd_jump_dep *)arg;
u8 active = cmd->active;
kfree(arg);
if (params_len == -ENOENT) { if (params_len == -ENOENT) {
nfc_dev_dbg(&dev->interface->dev, ""); nfc_dev_dbg(&dev->interface->dev, "");
...@@ -1704,7 +1708,6 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, ...@@ -1704,7 +1708,6 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
} }
resp = (struct pn533_cmd_jump_dep_response *) params; resp = (struct pn533_cmd_jump_dep_response *) params;
cmd = (struct pn533_cmd_jump_dep *) arg;
rc = resp->status & PN533_CMD_RET_MASK; rc = resp->status & PN533_CMD_RET_MASK;
if (rc != PN533_CMD_RET_SUCCESS) { if (rc != PN533_CMD_RET_SUCCESS) {
nfc_dev_err(&dev->interface->dev, nfc_dev_err(&dev->interface->dev,
...@@ -1734,7 +1737,7 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, ...@@ -1734,7 +1737,7 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg,
if (rc == 0) if (rc == 0)
rc = nfc_dep_link_is_up(dev->nfc_dev, rc = nfc_dep_link_is_up(dev->nfc_dev,
dev->nfc_dev->targets[0].idx, dev->nfc_dev->targets[0].idx,
!cmd->active, NFC_RF_INITIATOR); !active, NFC_RF_INITIATOR);
return 0; return 0;
} }
...@@ -1819,12 +1822,8 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target, ...@@ -1819,12 +1822,8 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame, rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame,
dev->in_maxlen, pn533_in_dep_link_up_complete, dev->in_maxlen, pn533_in_dep_link_up_complete,
cmd, GFP_KERNEL); cmd, GFP_KERNEL);
if (rc) if (rc < 0)
goto out; kfree(cmd);
out:
kfree(cmd);
return rc; return rc;
} }
...@@ -2078,8 +2077,12 @@ static int pn533_transceive(struct nfc_dev *nfc_dev, ...@@ -2078,8 +2077,12 @@ static int pn533_transceive(struct nfc_dev *nfc_dev,
static int pn533_tm_send_complete(struct pn533 *dev, void *arg, static int pn533_tm_send_complete(struct pn533 *dev, void *arg,
u8 *params, int params_len) u8 *params, int params_len)
{ {
struct sk_buff *skb_out = arg;
nfc_dev_dbg(&dev->interface->dev, "%s", __func__); nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
dev_kfree_skb(skb_out);
if (params_len < 0) { if (params_len < 0) {
nfc_dev_err(&dev->interface->dev, nfc_dev_err(&dev->interface->dev,
"Error %d when sending data", "Error %d when sending data",
...@@ -2117,7 +2120,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) ...@@ -2117,7 +2120,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame, rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame,
dev->in_maxlen, pn533_tm_send_complete, dev->in_maxlen, pn533_tm_send_complete,
NULL, GFP_KERNEL); skb, GFP_KERNEL);
if (rc) { if (rc) {
nfc_dev_err(&dev->interface->dev, nfc_dev_err(&dev->interface->dev,
"Error %d when trying to send data", rc); "Error %d when trying to send data", rc);
......
...@@ -429,6 +429,17 @@ static struct attribute_group netstat_group = { ...@@ -429,6 +429,17 @@ static struct attribute_group netstat_group = {
.name = "statistics", .name = "statistics",
.attrs = netstat_attrs, .attrs = netstat_attrs,
}; };
#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
static struct attribute *wireless_attrs[] = {
NULL
};
static struct attribute_group wireless_group = {
.name = "wireless",
.attrs = wireless_attrs,
};
#endif
#endif /* CONFIG_SYSFS */ #endif /* CONFIG_SYSFS */
#ifdef CONFIG_RPS #ifdef CONFIG_RPS
...@@ -1409,6 +1420,15 @@ int netdev_register_kobject(struct net_device *net) ...@@ -1409,6 +1420,15 @@ int netdev_register_kobject(struct net_device *net)
groups++; groups++;
*groups++ = &netstat_group; *groups++ = &netstat_group;
#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
if (net->ieee80211_ptr)
*groups++ = &wireless_group;
#if IS_ENABLED(CONFIG_WIRELESS_EXT)
else if (net->wireless_handlers)
*groups++ = &wireless_group;
#endif
#endif
#endif /* CONFIG_SYSFS */ #endif /* CONFIG_SYSFS */
error = device_add(dev); error = device_add(dev);
......
...@@ -252,6 +252,7 @@ struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu) ...@@ -252,6 +252,7 @@ struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu)
return NULL; return NULL;
dst->ops->update_pmtu(dst, sk, NULL, mtu); dst->ops->update_pmtu(dst, sk, NULL, mtu);
return inet6_csk_route_socket(sk, &fl6); dst = inet6_csk_route_socket(sk, &fl6);
return IS_ERR(dst) ? NULL : dst;
} }
EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu); EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu);
...@@ -1151,10 +1151,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) ...@@ -1151,10 +1151,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
mutex_lock(&sdata->u.ibss.mtx); mutex_lock(&sdata->u.ibss.mtx);
sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
memset(sdata->u.ibss.bssid, 0, ETH_ALEN);
sdata->u.ibss.ssid_len = 0;
active_ibss = ieee80211_sta_active_ibss(sdata); active_ibss = ieee80211_sta_active_ibss(sdata);
if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
...@@ -1175,6 +1171,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) ...@@ -1175,6 +1171,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
} }
} }
ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
memset(ifibss->bssid, 0, ETH_ALEN);
ifibss->ssid_len = 0;
sta_info_flush(sdata->local, sdata); sta_info_flush(sdata->local, sdata);
spin_lock_bh(&ifibss->incomplete_lock); spin_lock_bh(&ifibss->incomplete_lock);
......
...@@ -1210,7 +1210,7 @@ int nfc_llcp_register_device(struct nfc_dev *ndev) ...@@ -1210,7 +1210,7 @@ int nfc_llcp_register_device(struct nfc_dev *ndev)
local->remote_miu = LLCP_DEFAULT_MIU; local->remote_miu = LLCP_DEFAULT_MIU;
local->remote_lto = LLCP_DEFAULT_LTO; local->remote_lto = LLCP_DEFAULT_LTO;
list_add(&llcp_devices, &local->list); list_add(&local->list, &llcp_devices);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment