Laissez-nous vous conter l'histoire de trois développeurs qui ont rencontré un problème réseau...
"J'ai des serveurs qui viennent d'arriver, et le réseau y marche po"
(Bon, si, mais uniquement sur la carte d'admin en 1Gbps, c'est pas pratique)
lspci, mais pas avec ip linkdmesg
[ 9.526144] QLogic FastLinQ 4xxxx Core Module qed
[ 9.531195] qede init: QLogic FastLinQ 4xxxx Ethernet Driver qede
[ 9.583755] [qed_mcp_nvm_info_populate:3374()]Failed getting number of images
[ 9.583758] [qed_hw_prepare_single:4722()]Failed to populate nvm info shadow
[ 9.583761] [qed_probe:513()]hw prepare failed
qed et qede sont les drivers responsables de ces cartes ;qed/qede...Bon, ça va pas nous aider. Autre idée ?
Rien ne marche, et il n'existe aucun driver disponible.
(et c'est moi qui l'ai eu, eheh)
"Mais Florian c'est totalement idiot, on casse jamais* la compatibilité ascendante dans Linux tu le sais tr... Oh, ça marche"
root@ubuntu-18-lts:~# ip a
[...]
6: ens2f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN [...]
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
7: ens2f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN [...]
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
8: ens2f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN [...]
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
9: ens2f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN [...]
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
[...]
Et là, on hésite entre la joie et l'envie de pleurer
glibc notamment), un gestionnaire de paquet, de daemon, de fenêtres,
etc
Ne dites plus Debian mais Debian GNU/Linux !
(d'ailleurs, il existe une variante Debian GNU/Hurd)
[ 9.526144] QLogic FastLinQ 4xxxx Core Module qed
[ 9.531195] qede init: QLogic FastLinQ 4xxxx Ethernet Driver qede
[ 9.583755] [qed_mcp_nvm_info_populate:3374()]Failed getting number of images
[ 9.583758] [qed_hw_prepare_single:4722()]Failed to populate nvm info shadow
[ 9.583761] [qed_probe:513()]hw prepare failed
qed sur une invocation de qedeqed et qede ?qed contrôle directement le firmware, les interruptions système, etc ;qede expose les interfaces Ethernet de nos cartes ;qedr contrôle la convergence des 4 cartes Ethernet incluses dans notre carte PCI en un seul port
optique (infiniband) ;
qedi permet de gérer iSCSI (dans notre cas, aucun usage) ;qedf permet de gérer FCoE (idem).qed_mcp_nvm_info_populate
[ 9.526144] QLogic FastLinQ 4xxxx Core Module qed
[ 9.531195] qede init: QLogic FastLinQ 4xxxx Ethernet Driver qede
[ 9.583755] [qed_mcp_nvm_info_populate:3374()]Failed getting number of images <== ICI !
[ 9.583758] [qed_hw_prepare_single:4722()]Failed to populate nvm info shadow
[ 9.583761] [qed_probe:513()]hw prepare failed
qed_mcp_nvm_info_populate
/* Acquire from MFW the amount of available images */
nvm_info.num_images = 0;
rc = qed_mcp_bist_nvm_get_num_images(p_hwfn, p_ptt, &nvm_info.num_images);
if (rc == -EOPNOTSUPP) {
DP_INFO(p_hwfn, "DRV_MSG_CODE_BIST_TEST is not supported\n");
goto out;
} else if (rc || !nvm_info.num_images) {
DP_ERR(p_hwfn, "Failed getting number of images\n");
goto err0;
}
int qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, u32 *num_images) {
u32 drv_mb_param = 0, rsp;
int rc = 0;
drv_mb_param = (DRV_MB_PARAM_BIST_NVM_TEST_NUM_IMAGES << DRV_MB_PARAM_BIST_TEST_INDEX_SHIFT);
rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BIST_TEST, drv_mb_param, &rsp, num_images);
if (rc)
return rc;
if (((rsp & FW_MSG_CODE_MASK) != FW_MSG_CODE_OK))
rc = -EINVAL;
return rc;
}
print("papate"))
rsp & FW_MSG_CODE_MASK0x00000000qed_mfw_hsi.h on découvre que le code...
qed_mcp_nvm_info_populate, nous avions ceci :
if (rc == -EOPNOTSUPP) {
DP_INFO(p_hwfn, "DRV_MSG_CODE_BIST_TEST is not supported\n");
goto out;
}
... Sauf que si personne ne renvoie EOPNOTSUPP, ça sert pas à grand chose !
qed_mcp_bist_nvm_get_num_images :
int qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, u32 *num_images) {
u32 drv_mb_param = 0, rsp;
[...]
rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BIST_TEST, drv_mb_param, &rsp, num_images);
if (rc)
return rc;
+ if (((rsp & FW_MSG_CODE_MASK) == FW_MSG_CODE_UNSUPPORTED)) // <= Là :-)
+ rc = -EOPNOTSUPP;
~ else if (((rsp & FW_MSG_CODE_MASK) != FW_MSG_CODE_OK))
rc = -EINVAL;
return rc;
}
Et ça marche !
ChatGPT-5, 15/09/2025
J'ai une erreur "Failed getting number of images" sur une carte HPE QLogic 45000 avec une Debian 12 Kernel 6.1 Aide moi à diagnostiquer la cause de l'erreur.
[...]
Commence par confirmer quel driver est chargé pour cette carte : lspci -nnk | grep -A 3 -i qlogic
Puis regarde s'il y a des erreurs au chargement du module : dmesg -T | grep -iE "qlogic|qede|qla|qlcnic|qed"
[...]
Et là, ChatGPT nous propose déjà des solutions !
[...]
Liste le firmware installé :
dpkg -l | grep firmware
Tu devrais avoir quelque chose comme firmware-qlogic installé. Sinon :
sudo apt update ; sudo apt install firmware-qlogic
[...]
Jusque là, rien de bien différent par rapport aux suggestions de Google.
Il nous propose aussi d'explorer les propriétés de la carte
Il nous propose aussi de mettre à jour le Kernel (et il sait même la dernière version dans les backports)
Le driver chargé est qed/qede. De quelle partie du code vient l'erreur "Failed getting number of images" ?
Bonne précision ! Si le driver chargé est qed/qede, on est bien sur la famille de drivers pour les cartes réseau Ethernet/Converged Network
Adapters de Broadcom/QLogic (famille 44xxx/45xxx).
L’erreur "Failed getting number of images" vient en fait du qed_main.c (ou plus précisément du code de gestion du firmware dans le driver
qed), au moment où il tente d’interroger le Management Controller (MFW) de la carte pour connaître combien d’images de firmware/NVM sont
présentes.
Voici où ça se situe dans le code source du kernel Linux (drivers/net/ethernet/qlogic/qed/) :
Est-ce qu'il existe un patch pour ce problème précis ?
Un patch intitulé “net/qed: allow old cards not [able to return]” (résumé) qui modifie le comportement introduit par le commit 43645ce03e00
(“qed: Populate nvm image attribute shadow.”).
Le commit original “Populate nvm image attribute shadow” ajoutait la gestion d’un attribut “num_images” pour les images NVM. Cela veut dire
que le driver essaie toujours de demander au firmware le nombre d’images, via la commande mentionnée précédemment.
lkml.org
Mais certaines cartes anciennes ou spécifiques ne supportent pas cette commande / n’ont pas la capacité de renvoyer cette information, donc
l’appel échoue avec EINVAL.
Quels sont les auteurs du patch ?
D’après les discussions sur les listes de diffusion kernel, les principaux contributeurs du patch sont :
Louis Leseur (HPE) – auteur du patch
📧 louis.leseur [at] hpe.com
→ C’est lui qui a soumis le correctif à la mailing list netdev [at] vger.kernel.org.
Jakub Kicinski (Kernel networking maintainer) – reviewer et intégrateur
📧 kuba [at] kernel.org
→ Responsable de l’acceptation dans la branche net.
David S. Miller (mainteneur networking de Linux) – merge final
📧 davem [at] davemloft.net