From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Gospodarek Subject: Re: [patch net-next 3/4] mlxsw: Add interface to access registers and process events Date: Fri, 24 Jul 2015 08:09:21 -0400 Message-ID: <20150724120920.GC504@gospo.home.greyhouse.net> References: <1437666216-3149-1-git-send-email-jiri@resnulli.us> <1437666216-3149-4-git-send-email-jiri@resnulli.us> <20150723211218.GB504@gospo.home.greyhouse.net> <20150724052453.GB2178@nanopsycho.orion> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev@vger.kernel.org, davem@davemloft.net, idosch@mellanox.com, eladr@mellanox.com, ogerlitz@mellanox.com, sfeldma@gmail.com, roopa@cumulusnetworks.com, f.fainelli@gmail.com, tgraf@suug.ch, ast@plumgrid.com, jhs@mojatatu.com, daniel@iogearbox.net, john.fastabend@gmail.com, simon.horman@netronome.com, linville@tuxdriver.com, andy@greyhouse.net, shm@cumulusnetworks.com, nhorman@tuxdriver.com, Jiri Pirko To: Jiri Pirko Return-path: Received: from mail-qk0-f182.google.com ([209.85.220.182]:35069 "EHLO mail-qk0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752299AbbGXMJ3 (ORCPT ); Fri, 24 Jul 2015 08:09:29 -0400 Received: by qkbm65 with SMTP id m65so12638662qkb.2 for ; Fri, 24 Jul 2015 05:09:28 -0700 (PDT) Content-Disposition: inline In-Reply-To: <20150724052453.GB2178@nanopsycho.orion> Sender: netdev-owner@vger.kernel.org List-ID: On Fri, Jul 24, 2015 at 07:24:53AM +0200, Jiri Pirko wrote: > Thu, Jul 23, 2015 at 11:12:20PM CEST, gospo@cumulusnetworks.com wrote: > >On Thu, Jul 23, 2015 at 05:43:35PM +0200, Jiri Pirko wrote: > >> From: Ido Schimmel > >> > >> Add the ability to construct mailbox-style register access messages > >> called EMADs with provisions to construct and parse the registers payload. > >> Implement EMAD transaction layer which is responsible for the reliable > >> transmission of EMADs. > >> Also, add an infrastructure used by the switch driver to register for > >> particular events generated by the device. > >> > >> Signed-off-by: Ido Schimmel > >> Signed-off-by: Jiri Pirko > >> Signed-off-by: Elad Raz > >> --- > >> drivers/net/ethernet/mellanox/mlxsw/core.c | 736 ++++++++++++++++ > >> drivers/net/ethernet/mellanox/mlxsw/core.h | 21 + > >> drivers/net/ethernet/mellanox/mlxsw/emad.h | 127 +++ > >> drivers/net/ethernet/mellanox/mlxsw/port.h | 19 + > >> drivers/net/ethernet/mellanox/mlxsw/reg.h | 1289 ++++++++++++++++++++++++++++ > >> 5 files changed, 2192 insertions(+) > >> create mode 100644 drivers/net/ethernet/mellanox/mlxsw/emad.h > >> create mode 100644 drivers/net/ethernet/mellanox/mlxsw/reg.h > >> > >> diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c > >> index 211ec9b..bd0f692 100644 > >> --- a/drivers/net/ethernet/mellanox/mlxsw/core.c > >> +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c > >[...] > >> + struct list_head event_listener_list; > >> + struct { > >> + struct sk_buff *resp_skb; > >> + u64 tid; > >> + wait_queue_head_t wait; > >> + bool trans_active; > >> + struct mutex lock; /* One EMAD transaction at a time. */ > >> + bool use_emad; > >> + } emad; > >> struct mlxsw_core_pcpu_stats __percpu *pcpu_stats; > >> struct dentry *dbg_dir; > >> struct { > >[...] > >> } > >> > >> INIT_LIST_HEAD(&mlxsw_core->rx_listener_list); > >> + INIT_LIST_HEAD(&mlxsw_core->event_listener_list); > >> mlxsw_core->driver = mlxsw_driver; > >> mlxsw_core->bus = mlxsw_bus; > >> mlxsw_core->bus_priv = bus_priv; > >[...] > >> + /* No reason to save item if we did not manage to register an RX > >> + * listener for it. > >> + */ > >> + list_add_rcu(&el_item->list, &mlxsw_core->event_listener_list); > >> + > > > >I see where 'event_listener_list' is defined and where entries are > >added/removed, but where is the code that would receive these events and > >presumably search this list so all handlers registered (currently just > >PUDE) can handle events? > > That is handled by calling mlxsw_core_rx_listener_register. > that will add each event handler as a item to &mlxsw_core->rx_listener_list > These rx_listeners are called from mlxsw_core_skb_receive. > So event is here a special case of rx_listener. The event list is used > just to contain struct mlxsw_event_listener_item instances. > Thanks for the explanation! I missed how that was called the first time I went through this.