+static int bcmasp_set_priv_flags(struct net_device *dev, u32 flags) +{
- struct bcmasp_intf *intf = netdev_priv(dev);
- intf->wol_keep_rx_en = flags & BCMASP_WOL_KEEP_RX_EN ? 1 : 0;
- return 0;
Please could you explain this some more. How can you disable RX and still have WoL working?
Wake-on-LAN using Magic Packets and network filters requires keeping the UniMAC's receiver turned on, and then the packets feed into the Magic Packet Detector (MPD) block or the network filter block. In that mode DRAM is in self refresh and there is local matching of frames into a tiny FIFO however in the case of magic packets the packets leading to a wake-up are dropped as there is nowhere to store them. In the case of a network filter match (e.g.: matching a multicast IP address plus protocol, plus source/destination ports) the packets are also discarded because the receive DMA was shut down.
When the wol_keep_rx_en flag is set, the above happens but we also allow the packets that did match a network filter to reach the small FIFO (Justin would know how many entries are there) that is used to push the packets to DRAM. The packet contents are held in there until the system wakes up which is usually just a few hundreds of micro seconds after we received a packet that triggered a wake-up. Once we overflow the receive DMA FIFO capacity subsequent packets get dropped which is fine since we are usually talking about very low bit rates, and we only try to push to DRAM the packets of interest, that is those for which we have a network filter.
This is convenient in scenarios where you want to wake-up from multicast DNS (e.g.: wake on Googlecast, Bonjour etc.) because then the packet that resulted in the system wake-up is not discarded but is then delivered to the network stack.
Thanks for the explanation. It would be easier for the user if you automate this. Enable is by default for WoL types which have user content?
- /* Per ch */
- intf->tx_spb_dma = priv->base + TX_SPB_DMA_OFFSET(intf);
- intf->res.tx_spb_ctrl = priv->base + TX_SPB_CTRL_OFFSET(intf);
- /*
* Stop gap solution. This should be removed when 72165a0 is
* deprecated
*/
Is that an internal commit?
Yes this is a revision of the silicon that is not meant to see the light of day.
So this can all be removed?
Andrew
linaro-mm-sig@lists.linaro.org