|
From: | Krzysztof Wesołowski |
Subject: | Re: [lwip-users] how to set the link up |
Date: | Fri, 07 Jul 2017 17:21:34 +0000 |
One simplification would be to do those link monitoring operations on timer running on LwIP thread, it removes threading issues (ie. Modifying stack data, accessing PHY). Only dhcp/ip setup would need to come from external memory/queue.
On 07/07/2017 18:04, Noam Weissman wrote:
>
> Speed, duplex, link etc... is low level handling and the TCP stack is
> not aware of that.
>
>
> This is why you call the set_link_up/down in your task, informing the
> stack !.
>
Yes, of course
> The MDIO interface between your micro and PHY has no relation with
> netif so why do you
>
> pass it as argument ?
>
because, in our implementation (NXP), netif->state is pointer to
structure containing information to interface with PHY.
> You several options to get the link state. You can connect the link
> led in the ETH connector
>
> to your micro and read it as a simple IO.
>
>
> If your PHY supports MII and it is connected as an MII you can hook an
> interrupt to the link line.
>
We are compliant to RMII, except interrupt signal that is not routed, so
we have to poll PHY.
> The third option is what I suggested to read the PHY basic register
> and check for the link bit.
>
Is what I do.
> Your link task should not only check if link is up or down but also
> know if it has changed !!. In your
>
> code is constantly calling the netifapi functions unless I missed
> something ?
>
Yes, I have further modified the task:
static void PhyStatus_Task( struct netif *netif )
{
enum { link_up, link_down } linkstatus = link_down;
phy_speed_t physpeed;
phy_duplex_t phyduplex;
bool link;
status_t result;
ETHSPDOFF();
netifapi_netif_set_link_down(netif);
while(1)
{
result = ethernetif_GetLinkStatus(netif, &link);
if(result == kStatus_Success)
{
switch(linkstatus)
{
case link_down:
if(true == link)
{
linkstatus = link_up;
netifapi_netif_set_link_up(netif);
}
break;
case link_up:
if(false == link)
{
linkstatus = link_down;
netifapi_netif_set_link_down(netif);
ETHSPDOFF();
}
else
{
result = ethernetif_GetLinkSpeedDuplex(netif,
&physpeed, &phyduplex);
if(result == kStatus_Success)
{
ETHSPD(physpeed);
}
}
break;
}
}
vTaskDelay(100);
}
}
I have investigated the problems: netifapi_netif_set_link_up() is called
and it cause call to link callback, in this function I call another
function in netifapi (netifapi_dhcp_start()), so I have a deadlock.
best regards
Max
_______________________________________________
lwip-users mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/lwip-users
[Prev in Thread] | Current Thread | [Next in Thread] |