arch_phy_irq: Now returns int instead of xcpt_t oldhandler. The oldhandler is useless after the changes to the interrupt argument. Also access an argument for the PHY interrupt. phy_notify.c driver changed to exploit new interrupt argument passing.

This commit is contained in:
Gregory Nutt 2017-03-02 08:42:13 -06:00
parent 75446b349b
commit f5f9d82d5a
10 changed files with 88 additions and 256 deletions

View File

@ -629,6 +629,7 @@ struct tiva_ethmac_s
struct work_s work; /* For deferring work to the work queue */
#ifdef CONFIG_TIVA_PHY_INTERRUPTS
xcpt_t handler; /* Attached PHY interrupt handler */
void *arg; /* Argument that accompanies the interrupt */
#endif
/* This holds the information visible to the NuttX network */
@ -2165,9 +2166,9 @@ static int tiva_interrupt(int irq, FAR void *context, FAR void *arg)
/* Dispatch to the registered handler */
if (priv->handler)
if (priv->handler != NULL)
{
(void)priv->handler(irq, context, arg);
(void)priv->handler(irq, context, priv->arg);
}
}
#endif
@ -4254,23 +4255,22 @@ void up_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_TIVA_PHY_INTERRUPTS
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
struct tiva_ethmac_s *priv;
irqstate_t flags;
xcpt_t oldhandler;
DEBUGASSERT(intf);
ninfo("%s: handler=%p\n", intf, handler);
@ -4290,10 +4290,10 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
/* Save the new interrupt handler information */
oldhandler = priv->handler;
priv->handler = handler;
priv->arg = arg;
/* Return with the interrupt disabled in any case */
@ -4306,10 +4306,8 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
*enable = handler ? tiva_phy_intenable : NULL;
}
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_TIVA_PHY_INTERRUPTS */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/sam4e-ek/src/sam_ethernet.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2014, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -83,14 +83,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAM34_GPIOD_IRQ
static xcpt_t g_emac_handler;
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -184,23 +176,21 @@ void weak_function sam_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAM34_GPIOD_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
gpio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -213,7 +203,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAM34_EMAC_DEVNAME) == 0)
{
phyinfo("Select EMAC\n");
phandler = &g_emac_handler;
pinset = GPIO_PHY_IRQ;
irq = SAM_PHY_IRQ;
enabler = sam_emac_phy_enable;
@ -230,11 +219,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -243,7 +227,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_gpioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -266,7 +250,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAM34_GPIOD_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/sama5d3-xplained/src/sam_ethernet.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2014, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -93,19 +93,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
#ifdef CONFIG_SAMA5_EMACA
static xcpt_t g_emac_handler;
#endif
#ifdef CONFIG_SAMA5_GMAC
static xcpt_t g_gmac_handler;
#endif
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -255,23 +242,21 @@ void weak_function sam_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
pio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -290,7 +275,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0)
{
phyinfo("Select EMAC\n");
phandler = &g_emac_handler;
pinset = PIO_INT_ETH1;
irq = IRQ_INT_ETH1;
enabler = sam_emac_phy_enable;
@ -301,7 +285,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0)
{
phyinfo("Select GMAC\n");
phandler = &g_gmac_handler;
pinset = PIO_INT_ETH0;
irq = IRQ_INT_ETH0;
enabler = sam_gmac_phy_enable;
@ -319,11 +302,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -332,7 +310,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_pioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -355,7 +333,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAMA5_PIOE_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/sama5d3x-ek/src/sam_ethernet.c
*
* Copyright (C) 2013-2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2013-2014, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -93,19 +93,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
#ifdef CONFIG_SAMA5_EMACA
static xcpt_t g_emac_handler;
#endif
#ifdef CONFIG_SAMA5_GMAC
static xcpt_t g_gmac_handler;
#endif
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -255,23 +242,21 @@ void weak_function sam_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
pio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -290,7 +275,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0)
{
phyinfo("Select EMAC\n");
phandler = &g_emac_handler;
pinset = PIO_INT_ETH1;
irq = IRQ_INT_ETH1;
enabler = sam_emac_phy_enable;
@ -301,7 +285,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0)
{
phyinfo("Select GMAC\n");
phandler = &g_gmac_handler;
pinset = PIO_INT_ETH0;
irq = IRQ_INT_ETH0;
enabler = sam_gmac_phy_enable;
@ -319,11 +302,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -332,7 +310,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_pioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -355,7 +333,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAMA5_PIOE_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/sama5d4-ek/src/sam_ethernet.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2014, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -93,19 +93,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
#ifdef CONFIG_SAMA5_EMAC0
static xcpt_t g_emac0_handler;
#endif
#ifdef CONFIG_SAMA5_EMAC1
static xcpt_t g_emac1_handler;
#endif
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -224,23 +211,21 @@ void weak_function sam_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAMA5_PIOE_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
pio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -259,7 +244,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_EMAC0_DEVNAME) == 0)
{
phyinfo("Select EMAC0\n");
phandler = &g_emac0_handler;
pinset = PIO_INT_ETH0;
irq = IRQ_INT_ETH0;
enabler = sam_emac0_phy_enable;
@ -270,7 +254,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMA5_EMAC1_DEVNAME) == 0)
{
phyinfo("Select EMAC1\n");
phandler = &g_emac1_handler;
pinset = PIO_INT_ETH1;
irq = IRQ_INT_ETH1;
enabler = sam_emac1_phy_enable;
@ -288,11 +271,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -301,7 +279,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_pioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -324,7 +302,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAMA5_PIOE_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/same70-xplained/src/sam_ethernet.c
*
* Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
* Copyright (C) 2015-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -89,14 +89,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAMV7_GPIOA_IRQ
static xcpt_t g_emac0_handler;
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -288,23 +280,21 @@ int sam_emac0_setmac(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAMV7_GPIOA_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
gpio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -317,7 +307,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
if (strcmp(intf, SAMV7_EMAC0_DEVNAME) == 0)
{
phyinfo("Select EMAC0\n");
phandler = &g_emac0_handler;
pinset = GPIO_EMAC0_INT;
irq = IRQ_EMAC0_INT;
enabler = sam_emac0_phy_enable;
@ -334,11 +323,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -347,7 +331,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_gpioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -370,7 +354,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAMV7_GPIOA_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/samv71-xult/src/sam_ethernet.c
*
* Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
* Copyright (C) 2015-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -89,14 +89,6 @@
# define phyinfo(x...)
#endif
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_SAMV7_GPIOA_IRQ
static xcpt_t g_emac0_handler;
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
@ -292,23 +284,21 @@ int sam_emac0_setmac(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_SAMV7_GPIOA_IRQ
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
irqstate_t flags;
xcpt_t *phandler;
xcpt_t oldhandler;
gpio_pinset_t pinset;
phy_enable_t enabler;
int irq;
@ -322,7 +312,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
{
phyinfo("Select EMAC0\n");
phandler = &g_emac0_handler;
pinset = GPIO_EMAC0_INT;
irq = IRQ_EMAC0_INT;
enabler = sam_emac0_phy_enable;
@ -339,11 +328,6 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
flags = enter_critical_section();
/* Get the old interrupt handler and save the new one */
oldhandler = *phandler;
*phandler = handler;
/* Configure the interrupt */
if (handler)
@ -352,7 +336,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
sam_gpioirq(pinset);
phyinfo("Attach IRQ%d\n", irq);
(void)irq_attach(irq, handler, NULL);
(void)irq_attach(irq, handler, arg);
}
else
{
@ -375,7 +359,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
/* Return the old handler (so that it can be restored) */
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif /* CONFIG_SAMV7_GPIOA_IRQ */

View File

@ -1,7 +1,7 @@
/************************************************************************************
* configs/stm32f4discovery/src/stm32_ethernet.c
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Copyright (C) 2015, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -94,6 +94,7 @@
#ifdef HAVE_NETMONITOR
static xcpt_t g_ethmac_handler;
static void *g_ethmac_arg;
#endif
/************************************************************************************
@ -113,7 +114,7 @@ static void stm32_emac0_phy_enable(bool enable)
/* Attach and enable GPIO interrupt (and event) on the falling edge */
(void)stm32_gpiosetevent(GPIO_EMAC_NINT, false, true, true,
g_ethmac_handler, NULL);
g_ethmac_handler, g_ethmac_arg);
}
else
{
@ -203,22 +204,21 @@ void weak_function stm32_netinitialize(void)
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef HAVE_NETMONITOR
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable)
{
phy_enable_t enabler;
xcpt_t oldhandler;
irqstate_t flags;
ninfo("%s: handler=%p\n", intf, handler);
@ -226,13 +226,13 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
DEBUGASSERT(intf);
flags = enter_critical_section();
oldhandler = g_ethmac_handler;
flags = enter_critical_section();
if (strcmp(intf, STM32_ETHMAC_DEVNAME) == 0)
{
phyinfo("Select ETHMAC\n");
g_ethmac_handler = handler;
g_ethmac_arg = arg;
enabler = stm32_emac0_phy_enable;
}
else
@ -247,7 +247,7 @@ xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable)
}
leave_critical_section(flags);
return oldhandler;
return OK;
}
#endif

View File

@ -102,7 +102,6 @@ struct phy_notify_s
{
bool assigned;
uint8_t signo;
uint8_t index;
#ifdef CONFIG_NETDEV_MULTINIC
char intf[CONFIG_PHY_NOTIFICATION_MAXINTFLEN+1];
#endif
@ -115,17 +114,11 @@ struct phy_notify_s
* Private Function Prototypes
****************************************************************************/
static int phy_handler(FAR struct phy_notify_s *client);
static int phy_handler_0(int irq, FAR void *context, FAR void *arg);
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 1
static int phy_handler_1(int irq, FAR void *context, FAR void *arg);
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 2
static int phy_handler_2(int irq, FAR void *context, FAR void *arg);
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 3
static int phy_handler_3(int irq, FAR void *context, FAR void *arg);
#endif
#endif
#endif
static void phy_semtake(void);
static FAR struct phy_notify_s *phy_find_unassigned(void);
static FAR struct phy_notify_s *phy_find_assigned(FAR const char *intf,
pid_t pid);
static int phy_handler(int irq, FAR void *context, FAR void *arg);
/****************************************************************************
* Private Data
@ -138,22 +131,6 @@ static sem_t g_notify_clients_sem = SEM_INITIALIZER(1);
static struct phy_notify_s g_notify_clients[CONFIG_PHY_NOTIFICATION_NCLIENTS];
/* Handler addresses accessed with the same index as g_notify_clients[] */
static const xcpt_t g_notify_handler[CONFIG_PHY_NOTIFICATION_NCLIENTS] =
{
phy_handler_0
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 1
, phy_handler_1
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 2
, phy_handler_2
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 3
, phy_handler_3
#endif
#endif
#endif
};
/****************************************************************************
* Private Functions
****************************************************************************/
@ -197,7 +174,6 @@ static FAR struct phy_notify_s *phy_find_unassigned(void)
client->assigned = true;
client->signo = 0;
client->index = i;
#ifdef CONFIG_NETDEV_MULTINIC
client->intf[0] = '\0';
#endif
@ -258,16 +234,16 @@ static FAR struct phy_notify_s *phy_find_assigned(FAR const char *intf,
* Name: phy_handler
****************************************************************************/
static int phy_handler(FAR struct phy_notify_s *client)
static int phy_handler(int irq, FAR void *context, FAR void *arg)
{
FAR struct phy_notify_s *client = (FAR struct phy_notify_s *)arg;
#ifdef CONFIG_CAN_PASS_STRUCTS
union sigval value;
#endif
int ret;
DEBUGASSERT(client && client->assigned && client->enable);
phyinfo("Entry client %d, signalling PID=%d with signal %d\n",
client->index, client->pid, client->signo);
DEBUGASSERT(client != NULL && client->assigned && client->enable);
phyinfo("Signalling PID=%d with signal %d\n", client->pid, client->signo);
/* Disable further interrupts */
@ -294,36 +270,6 @@ static int phy_handler(FAR struct phy_notify_s *client)
return OK;
}
/****************************************************************************
* Name: phy_handler_0, phy_handler_1, ...
****************************************************************************/
static int phy_handler_0(int irq, FAR void *context, FAR void *arg)
{
return phy_handler(&g_notify_clients[0]);
}
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 1
static int phy_handler_1(int irq, FAR void *context, FAR void *arg)
{
return phy_handler(&g_notify_clients[1]);
}
#endif
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 2
static int phy_handler_2(int irq, FAR void *context, FAR void *arg)
{
return phy_handler(&g_notify_clients[2]);
}
#endif
#if CONFIG_PHY_NOTIFICATION_NCLIENTS > 3
static int phy_handler_3(int irq, FAR void *context, FAR void *arg)
{
return phy_handler(&g_notify_clients[3]);
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -358,6 +304,8 @@ int phy_notify_subscribe(FAR const char *intf, pid_t pid, int signo,
FAR void *arg)
{
FAR struct phy_notify_s *client;
int ret = OK;
DEBUGASSERT(intf);
ninfo("%s: PID=%d signo=%d arg=%p\n", intf, pid, signo, arg);
@ -403,14 +351,14 @@ int phy_notify_subscribe(FAR const char *intf, pid_t pid, int signo,
/* Attach/re-attach the PHY interrupt */
(void)arch_phy_irq(intf, g_notify_handler[client->index], &client->enable);
ret = arch_phy_irq(intf, phy_handler, client, &client->enable);
}
/* Enable/re-enable the PH interrupt */
DEBUGASSERT(client->enable);
client->enable(true);
return OK;
return ret;
}
/****************************************************************************

View File

@ -2247,19 +2247,19 @@ int up_rtc_settime(FAR const struct timespec *tp);
* asserts an interrupt. Must reside in OS space, but can
* signal tasks in user space. A value of NULL can be passed
* in order to detach and disable the PHY interrupt.
* arg - The argument that will accompany the interrupt
* enable - A function pointer that be unsed to enable or disable the
* PHY interrupt.
*
* Returned Value:
* The previous PHY interrupt handler address is returned. This allows you
* to temporarily replace an interrupt handler, then restore the original
* interrupt handler. NULL is returned if there is was not handler in
* place when the call was made.
* Zero (OK) returned on success; a negated errno value is returned on
* failure.
*
****************************************************************************/
#ifdef CONFIG_ARCH_PHY_INTERRUPT
xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler, phy_enable_t *enable);
int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg,
phy_enable_t *enable);
#endif
/****************************************************************************