From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93F9BC64E7B for ; Sat, 28 Nov 2020 22:13:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 777F12222C for ; Sat, 28 Nov 2020 22:13:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389250AbgK1Vt4 (ORCPT ); Sat, 28 Nov 2020 16:49:56 -0500 Received: from vps0.lunn.ch ([185.16.172.187]:54606 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387519AbgK1TY4 (ORCPT ); Sat, 28 Nov 2020 14:24:56 -0500 Received: from andrew by vps0.lunn.ch with local (Exim 4.94) (envelope-from ) id 1kj5pK-009HRH-ID; Sat, 28 Nov 2020 20:24:10 +0100 Date: Sat, 28 Nov 2020 20:24:10 +0100 From: Andrew Lunn To: Steen Hegelund Cc: "David S. Miller" , Jakub Kicinski , Masahiro Yamada , Lars Povlsen , Bjarni Jonasson , Microchip Linux Driver Support , Alexandre Belloni , Microsemi List , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH 2/3] net: sparx5: Add Sparx5 switchdev driver Message-ID: <20201128192410.GG2191767@lunn.ch> References: <20201127133307.2969817-1-steen.hegelund@microchip.com> <20201127133307.2969817-3-steen.hegelund@microchip.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20201127133307.2969817-3-steen.hegelund@microchip.com> Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org > +static void sparx5_attr_stp_state_set(struct sparx5_port *port, > + struct switchdev_trans *trans, > + u8 state) > +{ > + struct sparx5 *sparx5 = port->sparx5; > + > + if (!test_bit(port->portno, sparx5->bridge_mask)) { > + netdev_err(port->ndev, > + "Controlling non-bridged port %d?\n", port->portno); > + return; > + } > + > + switch (state) { > + case BR_STATE_FORWARDING: > + set_bit(port->portno, sparx5->bridge_fwd_mask); > + break; > + default: > + clear_bit(port->portno, sparx5->bridge_fwd_mask); > + break; > + } That is pretty odd. What about listening, learning, blocking? > +static int sparx5_port_bridge_join(struct sparx5_port *port, > + struct net_device *bridge) > +{ > + struct sparx5 *sparx5 = port->sparx5; > + > + if (bitmap_empty(sparx5->bridge_mask, SPX5_PORTS)) > + /* First bridged port */ > + sparx5->hw_bridge_dev = bridge; > + else > + if (sparx5->hw_bridge_dev != bridge) > + /* This is adding the port to a second bridge, this is > + * unsupported > + */ > + return -ENODEV; > + > + set_bit(port->portno, sparx5->bridge_mask); > + > + /* Port enters in bridge mode therefor don't need to copy to CPU > + * frames for multicast in case the bridge is not requesting them > + */ > + __dev_mc_unsync(port->ndev, sparx5_mc_unsync); > + > + return 0; > +} This looks suspiciously empty? Don't you need to tell the hardware which ports this port is bridges to? Normally you see some code which walks all the ports and finds those in the same bridge, and sets a bit which allows these ports to talk to each other. Is that code somewhere else? Andrew