Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b803841 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull networking fixes from David Miller:
 "A quick batch of fixes, including the annoying bad lock stack problem
  introduced by udp_sk_rx_dst_set() locking change:

   1) Use xchg() instead of sk_dst_lock() in udp_sk_rx_dst_set(), from
      Eric Dumazet.

   2) qlcnic bug fixes from Himanshu Madhani and Manish Chopra.

   3) Update IPSEC MAINTAINERS entry, from Steffen Klassert.

   4) Administrative neigh entry changes should generate netlink
      notifications the same as event generated ones.  From Bob
      Gilligan.

   5) Netfilter SYNPROXY fixes from Patrick McHardy.

   6) Netfilter nft_reject endianness fixes from Eric Leblond"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  qlcnic: Dump mailbox registers when mailbox command times out.
  qlcnic: Fix mailbox processing during diagnostic test
  qlcnic: Allow firmware dump collection when auto firmware recovery is disabled
  qlcnic: Fix memory allocation
  qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter.
  qlcnic: Fix TSS/RSS ring validation logic.
  qlcnic: Fix diagnostic test for all adapters.
  qlcnic: Fix usage of netif_tx_{wake, stop} api during link change.
  xen-netback: fix fragments error handling in checksum_setup_ip()
  neigh: Netlink notification for administrative NUD state change
  ipv4: improve documentation of ip_no_pmtu_disc
  net: unix: allow bind to fail on mutex lock
  MAINTAINERS: Update the IPsec maintainer entry
  udp: ipv4: do not use sk_dst_lock from softirq context
  netvsc: don't flush peers notifying work during setting mtu
  can: peak_usb: fix mem leak in pcan_usb_pro_init()
  can: ems_usb: fix urb leaks on failure paths
  sctp: loading sctp when load sctp_probe
  netfilter: nft_reject: fix endianness in dump function
  netfilter: SYNPROXY target: restrict to INPUT/FORWARD
parents b0031f22 78106927
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -16,8 +16,12 @@ ip_default_ttl - INTEGER
	Default: 64 (as recommended by RFC1700)
	Default: 64 (as recommended by RFC1700)


ip_no_pmtu_disc - BOOLEAN
ip_no_pmtu_disc - BOOLEAN
	Disable Path MTU Discovery.
	Disable Path MTU Discovery. If enabled and a
	default FALSE
	fragmentation-required ICMP is received, the PMTU to this
	destination will be set to min_pmtu (see below). You will need
	to raise min_pmtu to the smallest interface MTU on your system
	manually if you want to avoid locally generated fragments.
	Default: FALSE


min_pmtu - INTEGER
min_pmtu - INTEGER
	default 552 - minimum discovered Path MTU
	default 552 - minimum discovered Path MTU
+10 −1
Original line number Original line Diff line number Diff line
@@ -5913,12 +5913,21 @@ M: Steffen Klassert <steffen.klassert@secunet.com>
M:	Herbert Xu <herbert@gondor.apana.org.au>
M:	Herbert Xu <herbert@gondor.apana.org.au>
M:	"David S. Miller" <davem@davemloft.net>
M:	"David S. Miller" <davem@davemloft.net>
L:	netdev@vger.kernel.org
L:	netdev@vger.kernel.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git
S:	Maintained
S:	Maintained
F:	net/xfrm/
F:	net/xfrm/
F:	net/key/
F:	net/key/
F:	net/ipv4/xfrm*
F:	net/ipv4/xfrm*
F:	net/ipv4/esp4.c
F:	net/ipv4/ah4.c
F:	net/ipv4/ipcomp.c
F:	net/ipv4/ip_vti.c
F:	net/ipv6/xfrm*
F:	net/ipv6/xfrm*
F:	net/ipv6/esp6.c
F:	net/ipv6/ah6.c
F:	net/ipv6/ipcomp6.c
F:	net/ipv6/ip6_vti.c
F:	include/uapi/linux/xfrm.h
F:	include/uapi/linux/xfrm.h
F:	include/net/xfrm.h
F:	include/net/xfrm.h


+2 −1
Original line number Original line Diff line number Diff line
@@ -625,6 +625,7 @@ static int ems_usb_start(struct ems_usb *dev)
			usb_unanchor_urb(urb);
			usb_unanchor_urb(urb);
			usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
			usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
					  urb->transfer_dma);
					  urb->transfer_dma);
			usb_free_urb(urb);
			break;
			break;
		}
		}


@@ -798,8 +799,8 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
	 * allowed (MAX_TX_URBS).
	 * allowed (MAX_TX_URBS).
	 */
	 */
	if (!context) {
	if (!context) {
		usb_unanchor_urb(urb);
		usb_free_coherent(dev->udev, size, buf, urb->transfer_dma);
		usb_free_coherent(dev->udev, size, buf, urb->transfer_dma);
		usb_free_urb(urb);


		netdev_warn(netdev, "couldn't find free context\n");
		netdev_warn(netdev, "couldn't find free context\n");


+3 −0
Original line number Original line Diff line number Diff line
@@ -927,6 +927,9 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev)
	/* set LED in default state (end of init phase) */
	/* set LED in default state (end of init phase) */
	pcan_usb_pro_set_led(dev, 0, 1);
	pcan_usb_pro_set_led(dev, 0, 1);


	kfree(bi);
	kfree(fi);

	return 0;
	return 0;


 err_out:
 err_out:
+21 −26
Original line number Original line Diff line number Diff line
@@ -447,7 +447,8 @@ irqreturn_t qlcnic_83xx_intr(int irq, void *data)


	qlcnic_83xx_poll_process_aen(adapter);
	qlcnic_83xx_poll_process_aen(adapter);


	if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
	if (ahw->diag_test) {
		if (ahw->diag_test == QLCNIC_INTERRUPT_TEST)
			ahw->diag_cnt++;
			ahw->diag_cnt++;
		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
		return IRQ_HANDLED;
		return IRQ_HANDLED;
@@ -1345,11 +1346,6 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
	}
	}


	if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
	if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
		/* disable and free mailbox interrupt */
		if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
			qlcnic_83xx_enable_mbx_poll(adapter);
			qlcnic_83xx_free_mbx_intr(adapter);
		}
		adapter->ahw->loopback_state = 0;
		adapter->ahw->loopback_state = 0;
		adapter->ahw->hw_ops->setup_link_event(adapter, 1);
		adapter->ahw->hw_ops->setup_link_event(adapter, 1);
	}
	}
@@ -1363,33 +1359,20 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
{
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_host_sds_ring *sds_ring;
	struct qlcnic_host_sds_ring *sds_ring;
	int ring, err;
	int ring;


	clear_bit(__QLCNIC_DEV_UP, &adapter->state);
	clear_bit(__QLCNIC_DEV_UP, &adapter->state);
	if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
	if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
		for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
		for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
			sds_ring = &adapter->recv_ctx->sds_rings[ring];
			sds_ring = &adapter->recv_ctx->sds_rings[ring];
			if (adapter->flags & QLCNIC_MSIX_ENABLED)
				qlcnic_83xx_disable_intr(adapter, sds_ring);
				qlcnic_83xx_disable_intr(adapter, sds_ring);
			if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
				qlcnic_83xx_enable_mbx_poll(adapter);
		}
		}
	}
	}


	qlcnic_fw_destroy_ctx(adapter);
	qlcnic_fw_destroy_ctx(adapter);
	qlcnic_detach(adapter);
	qlcnic_detach(adapter);


	if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
		if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
			err = qlcnic_83xx_setup_mbx_intr(adapter);
			qlcnic_83xx_disable_mbx_poll(adapter);
			if (err) {
				dev_err(&adapter->pdev->dev,
					"%s: failed to setup mbx interrupt\n",
					__func__);
				goto out;
			}
		}
	}
	adapter->ahw->diag_test = 0;
	adapter->ahw->diag_test = 0;
	adapter->drv_sds_rings = drv_sds_rings;
	adapter->drv_sds_rings = drv_sds_rings;


@@ -1399,9 +1382,6 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
	if (netif_running(netdev))
	if (netif_running(netdev))
		__qlcnic_up(adapter, netdev);
		__qlcnic_up(adapter, netdev);


	if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST &&
	    !(adapter->flags & QLCNIC_MSIX_ENABLED))
		qlcnic_83xx_disable_mbx_poll(adapter);
out:
out:
	netif_device_attach(netdev);
	netif_device_attach(netdev);
}
}
@@ -3754,6 +3734,19 @@ static void qlcnic_83xx_decode_mbx_rsp(struct qlcnic_adapter *adapter,
	return;
	return;
}
}


static inline void qlcnic_dump_mailbox_registers(struct qlcnic_adapter *adapter)
{
	struct qlcnic_hardware_context *ahw = adapter->ahw;
	u32 offset;

	offset = QLCRDX(ahw, QLCNIC_DEF_INT_MASK);
	dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx control=0x%x, Fw mbx control=0x%x",
		 readl(ahw->pci_base0 + offset),
		 QLCRDX(ahw, QLCNIC_MBX_INTR_ENBL),
		 QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL),
		 QLCRDX(ahw, QLCNIC_FW_MBX_CTRL));
}

static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
{
{
	struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox,
	struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox,
@@ -3798,6 +3791,8 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
				__func__, cmd->cmd_op, cmd->type, ahw->pci_func,
				__func__, cmd->cmd_op, cmd->type, ahw->pci_func,
				ahw->op_mode);
				ahw->op_mode);
			clear_bit(QLC_83XX_MBX_READY, &mbx->status);
			clear_bit(QLC_83XX_MBX_READY, &mbx->status);
			qlcnic_dump_mailbox_registers(adapter);
			qlcnic_83xx_get_mbx_data(adapter, cmd);
			qlcnic_dump_mbx(adapter, cmd);
			qlcnic_dump_mbx(adapter, cmd);
			qlcnic_83xx_idc_request_reset(adapter,
			qlcnic_83xx_idc_request_reset(adapter,
						      QLCNIC_FORCE_FW_DUMP_KEY);
						      QLCNIC_FORCE_FW_DUMP_KEY);
Loading