Commit c040862b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'xtensa-20220804' of https://github.com/jcmvbkbc/linux-xtensa

Pull xtensa updates from Max Filippov:

 - support KCOV

 - enable ARCH_HAS_GCOV_PROFILE_ALL

 - minor ISS network driver cleanups

* tag 'xtensa-20220804' of https://github.com/jcmvbkbc/linux-xtensa:
  xtensa: enable ARCH_HAS_GCOV_PROFILE_ALL
  xtensa: enable KCOV support
  xtensa: iss: fix handling error cases in iss_net_configure()
  xtensa: iss/network: provide release() callback
  xtensa: iss/network: drop 'devices' list
parents 995177a4 0847d167
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -27,5 +27,5 @@
    |       sparc: | TODO |
    |       sparc: | TODO |
    |          um: |  ok  |
    |          um: |  ok  |
    |         x86: |  ok  |
    |         x86: |  ok  |
    |      xtensa: | TODO |
    |      xtensa: |  ok  |
    -----------------------
    -----------------------
+1 −1
Original line number Original line Diff line number Diff line
@@ -27,5 +27,5 @@
    |       sparc: | TODO |
    |       sparc: | TODO |
    |          um: |  ok  |
    |          um: |  ok  |
    |         x86: |  ok  |
    |         x86: |  ok  |
    |      xtensa: | TODO |
    |      xtensa: |  ok  |
    -----------------------
    -----------------------
+2 −0
Original line number Original line Diff line number Diff line
@@ -6,6 +6,8 @@ config XTENSA
	select ARCH_HAS_CURRENT_STACK_POINTER
	select ARCH_HAS_CURRENT_STACK_POINTER
	select ARCH_HAS_DEBUG_VM_PGTABLE
	select ARCH_HAS_DEBUG_VM_PGTABLE
	select ARCH_HAS_DMA_PREP_COHERENT if MMU
	select ARCH_HAS_DMA_PREP_COHERENT if MMU
	select ARCH_HAS_GCOV_PROFILE_ALL
	select ARCH_HAS_KCOV
	select ARCH_HAS_SYNC_DMA_FOR_CPU if MMU
	select ARCH_HAS_SYNC_DMA_FOR_CPU if MMU
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE if MMU
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE if MMU
	select ARCH_HAS_DMA_SET_UNCACHED if MMU
	select ARCH_HAS_DMA_SET_UNCACHED if MMU
+2 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,8 @@ endif


KASAN_SANITIZE := n
KASAN_SANITIZE := n
KCSAN_SANITIZE := n
KCSAN_SANITIZE := n
KCOV_INSTRUMENT := n
GCOV_PROFILE := n


CFLAGS_REMOVE_inflate.o += -fstack-protector -fstack-protector-strong
CFLAGS_REMOVE_inflate.o += -fstack-protector -fstack-protector-strong
CFLAGS_REMOVE_zmem.o += -fstack-protector -fstack-protector-strong
CFLAGS_REMOVE_zmem.o += -fstack-protector -fstack-protector-strong
+28 −35
Original line number Original line Diff line number Diff line
@@ -37,10 +37,6 @@
#define ETH_HEADER_OTHER 14
#define ETH_HEADER_OTHER 14
#define ISS_NET_TIMER_VALUE (HZ / 10)
#define ISS_NET_TIMER_VALUE (HZ / 10)



static DEFINE_SPINLOCK(devices_lock);
static LIST_HEAD(devices);

/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */


/* We currently only support the TUNTAP transport protocol. */
/* We currently only support the TUNTAP transport protocol. */
@@ -70,8 +66,6 @@ struct iss_net_ops {
/* This structure contains out private information for the driver. */
/* This structure contains out private information for the driver. */


struct iss_net_private {
struct iss_net_private {
	struct list_head device_list;

	spinlock_t lock;
	spinlock_t lock;
	struct net_device *dev;
	struct net_device *dev;
	struct platform_device pdev;
	struct platform_device pdev;
@@ -472,23 +466,30 @@ static const struct net_device_ops iss_netdev_ops = {
	.ndo_set_rx_mode	= iss_net_set_multicast_list,
	.ndo_set_rx_mode	= iss_net_set_multicast_list,
};
};


static int iss_net_configure(int index, char *init)
static void iss_net_pdev_release(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct iss_net_private *lp =
		container_of(pdev, struct iss_net_private, pdev);

	free_netdev(lp->dev);
}

static void iss_net_configure(int index, char *init)
{
{
	struct net_device *dev;
	struct net_device *dev;
	struct iss_net_private *lp;
	struct iss_net_private *lp;
	int err;


	dev = alloc_etherdev(sizeof(*lp));
	dev = alloc_etherdev(sizeof(*lp));
	if (dev == NULL) {
	if (dev == NULL) {
		pr_err("eth_configure: failed to allocate device\n");
		pr_err("eth_configure: failed to allocate device\n");
		return 1;
		return;
	}
	}


	/* Initialize private element. */
	/* Initialize private element. */


	lp = netdev_priv(dev);
	lp = netdev_priv(dev);
	*lp = (struct iss_net_private) {
	*lp = (struct iss_net_private) {
		.device_list		= LIST_HEAD_INIT(lp->device_list),
		.dev			= dev,
		.dev			= dev,
		.index			= index,
		.index			= index,
	};
	};
@@ -509,7 +510,7 @@ static int iss_net_configure(int index, char *init)
	if (!tuntap_probe(lp, index, init)) {
	if (!tuntap_probe(lp, index, init)) {
		pr_err("%s: invalid arguments. Skipping device!\n",
		pr_err("%s: invalid arguments. Skipping device!\n",
		       dev->name);
		       dev->name);
		goto errout;
		goto err_free_netdev;
	}
	}


	pr_info("Netdevice %d (%pM)\n", index, dev->dev_addr);
	pr_info("Netdevice %d (%pM)\n", index, dev->dev_addr);
@@ -517,17 +518,16 @@ static int iss_net_configure(int index, char *init)
	/* sysfs register */
	/* sysfs register */


	if (!driver_registered) {
	if (!driver_registered) {
		platform_driver_register(&iss_net_driver);
		if (platform_driver_register(&iss_net_driver))
			goto err_free_netdev;
		driver_registered = 1;
		driver_registered = 1;
	}
	}


	spin_lock(&devices_lock);
	list_add(&lp->device_list, &devices);
	spin_unlock(&devices_lock);

	lp->pdev.id = index;
	lp->pdev.id = index;
	lp->pdev.name = DRIVER_NAME;
	lp->pdev.name = DRIVER_NAME;
	platform_device_register(&lp->pdev);
	lp->pdev.dev.release = iss_net_pdev_release;
	if (platform_device_register(&lp->pdev))
		goto err_free_netdev;
	SET_NETDEV_DEV(dev, &lp->pdev.dev);
	SET_NETDEV_DEV(dev, &lp->pdev.dev);


	dev->netdev_ops = &iss_netdev_ops;
	dev->netdev_ops = &iss_netdev_ops;
@@ -536,23 +536,20 @@ static int iss_net_configure(int index, char *init)
	dev->irq = -1;
	dev->irq = -1;


	rtnl_lock();
	rtnl_lock();
	err = register_netdevice(dev);
	if (register_netdevice(dev)) {
		rtnl_unlock();
		rtnl_unlock();

	if (err) {
		pr_err("%s: error registering net device!\n", dev->name);
		pr_err("%s: error registering net device!\n", dev->name);
		/* XXX: should we call ->remove() here? */
		platform_device_unregister(&lp->pdev);
		free_netdev(dev);
		return;
		return 1;
	}
	}
	rtnl_unlock();


	timer_setup(&lp->tl, iss_net_user_timer_expire, 0);
	timer_setup(&lp->tl, iss_net_user_timer_expire, 0);


	return 0;
	return;


errout:
err_free_netdev:
	/* FIXME: unregister; free, etc.. */
	free_netdev(dev);
	return -EIO;
}
}


/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
@@ -574,7 +571,7 @@ struct iss_net_init {


static int __init iss_net_setup(char *str)
static int __init iss_net_setup(char *str)
{
{
	struct iss_net_private *device = NULL;
	struct iss_net_init *device = NULL;
	struct iss_net_init *new;
	struct iss_net_init *new;
	struct list_head *ele;
	struct list_head *ele;
	char *end;
	char *end;
@@ -595,16 +592,12 @@ static int __init iss_net_setup(char *str)
	}
	}
	str = end;
	str = end;


	spin_lock(&devices_lock);
	list_for_each(ele, &eth_cmd_line) {

		device = list_entry(ele, struct iss_net_init, list);
	list_for_each(ele, &devices) {
		device = list_entry(ele, struct iss_net_private, device_list);
		if (device->index == n)
		if (device->index == n)
			break;
			break;
	}
	}


	spin_unlock(&devices_lock);

	if (device && device->index == n) {
	if (device && device->index == n) {
		pr_err("Device %u already configured\n", n);
		pr_err("Device %u already configured\n", n);
		return 1;
		return 1;