From: Jakub Kicinski > Sent: 26 July 2017 19:10 > We generally look up firmware by card type, but that doesn't allow > users who have more than one card of the same type in their system > to select firmware per adapter. > > Unfortunately user space firmware helper seems fraught with > difficulties and to be on its way out. In particular support for > handling firmware uevents have been dropped from systemd and most > distributions don't enable the FW fallback by default any more. > > To allow users selecting firmware for a particular device look up > firmware names by serial and pci_name(). Use the direct lookup to > disable generating uevents when enabled in Kconfig and not print > any warnings to logs if adapter-specific files are missing. Users > can place in /lib/firmware/netronome files named: > > pci-${pci_name}.nffw > serial-${serial}.nffw > > to target a specific card. E.g.: > > pci-0000:04:00.0.nffw > pci-0000:82:00.0.nffw > serial-00-aa-bb-11-22-33-10-ff.nffw > > We use the full serial number including the interface id, as it > appears in lspci output (bytes separated by '-').
Where does lspci get that from? > Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com> > --- > drivers/net/ethernet/netronome/nfp/nfp_main.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c > b/drivers/net/ethernet/netronome/nfp/nfp_main.c > index d67969d3e484..13d056da0765 100644 > --- a/drivers/net/ethernet/netronome/nfp/nfp_main.c > +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c > @@ -188,9 +188,27 @@ nfp_net_fw_find(struct pci_dev *pdev, struct nfp_pf *pf) > struct nfp_eth_table_port *port; > const char *fw_model; > char fw_name[256]; > + const u8 *serial; > int spc, err = 0; > + u16 interface; > int i, j; > > + /* First try to find a firmware image specific for this device */ > + interface = nfp_cpp_interface(pf->cpp); > + nfp_cpp_serial(pf->cpp, &serial); > + sprintf(fw_name, "netronome/serial-%pMF-%02hhx-%02hhx.nffw", > + serial, interface >> 8, interface & 0xff); WTF??? - use snprintf(). - kill those hh, the arguments are of type 'int'. In fact make 'interface' 'unsigned int' as well. David