Depuis pas mal de temps maintenant, j’utilise de l’Ethernet 10 Gb/s sur mon Mac en Thunderbolt. Mais ce n’est pas une partie de plaisir. Donc cette fois, j’ai tenté avec une carte Intel modifiée.
La solution de base consiste à utiliser une carte à base d’Aquantia, comme celle de Sonnet. macOS contient les pilotes, et ça doit fonctionner nativement, vu qu’Apple utilise cette puce dans ses Mac. Sauf qu’il y a un bug énervant : AirPlay 2 ne fonctionne pas avec une carte en Thunderbolt. Aucune idée de la raison, mais je n’ai pas de son sur le HomePod.
Ma seconde option, c’est une carte à base de Tehuti. Mais la carte chauffe, est moins performante que l’Aquantia, et les pilotes sont un peu légers. De temps en temps, j’ai des kernel panic à cause de la carte.
La troisième solution, c’est une carte Intel. Par défaut, les cartes Intel sont onéreuses, et (surtout) il n’y a pas de pilotes pour macOS. En pratique, on trouve facilement des cartes Intel d’occasion sur eBay (parfois en version Dell, HP, etc.) et une société propose des pilotes pour les cartes Intel, Small Tree. Par contre, ça nécessite un peu de boulot : il faut s’inscrire pour télécharger les pilotes (de Snow Leopard à Catalina) et – surtout – il faut modifier les cartes Intel pour qu’elles fonctionnent. La solution compliquée est de modifier la carte physiquement pour changer ses identifiants PCI. La solution moins compliquée passe par Linux. Tout le mode d’emploi vient de ce sujet dans les forums de MacRumors, j’ai juste modifié quelques lignes obsolètes et expliqué comment trouver les offsets.
Attention, je vous préviens : vous allez modifier les identifiants et donc la ROM de la carte. Je ne suis pas responsable d’une éventuelle erreur : ça a fonctionné pour moi, c’est tout ce que je peux vous affirmer. Attention aussi, l’article a été écrit sans captures, donc il reste peut-être des fautes de frappe dans les commandes (j’ai vérifié, mais bon).
Au départ, je voulais tester avec le sous-système Linux de Windows 10, mais il ne donne visiblement pas accès à la carte. Donc il faut télécharger l’ISO d’une distribution Linux (par exemple Ubuntu) et Rufus, un outil pour faire une clé USB. Il faut aussi évidemment une clé USB et un PC avec la carte branché en PCI-Express. Bon, ça marche peut-être en Thunderbolt directement sur le Mac, mais je n’ai pas testé.
Je vous le dis directement, vous allez devoir jouer de la ligne de commande.
J’ai commencé par une Intel X550, dotée de deux prises RJ45.
Une fois Ubuntu démarré, il faut installer ethtool
.
sudo apt-get install ethtool
Vous aurez besoin de l’identifiant donné par Linux à la carte. Il peut s’agir d’eth0
ou d’autre chose. Ca varie selon la carte et votre PC. Comme la carte en question possède deux connecteurs, elle a deux identifiants.
ip link show
Maintenant, il faut sauver le firmware. Il faut donc mettre l’identifiant de votre carte à la place de eth0
.
sudo ethtool -e eth0 raw on > eth0.bin
La commande suivante va récupérer les identifiants PCI de la carte. Il faut noter toutes les valeurs. La première valeur (8086:1563
) suit le nom de la carte, la seconde (8086:0001
dans mon cas) est dans la ligne qui commande par Subsystem
.
lspci -nn -vvv | grep Ethernet
Maintenant, vous allez avoir besoin d’un éditeur hexadécimal. J’ai installé Okteta depuis le magasin d’application d’Ubuntu, mais il en existe d’autres. Il faut ouvrir le firmware dumpé auparavant et cherche la valeur 8680
(l’ordre des octets est inversé). Normalement, avant ou après (selon le type de carte), vous trouverez la valeur inversée du Subsystem
(0100
dans mon cas, donc). Il faut ensuite notez l’offset, c’est-à-dire la valeur dans la colonne de gauche. Les valeurs 01
et 00
se trouvaient dans la ligne de l’offset 0x240
en 3e et 4e position, donc aux offsets 0x242
et 0x243
. Attention, nous sommes en hexadécimal, donc après 9, il y a A, B, etc. Je ne vais pas faire un cours sur l’hexadécimal mais si vous ne connaissez pas, vous trouverez facilement les explications. Si vous avez lu Joystick et d’autres magazines dans les années nonante, ça vous rappellera peut-être des souvenirs.
On arrive à la fin, il faut remplacer les valeurs d’origines (0001
) par celles attendues par les pilotes Small Tree (000a
). Il y a quatre commandes à taper. La première va modifier le premier octet, la seconde le second octet. La valeur qui suit l’argument magic
est l’identifiant de la carte. Attention, la casse a de l’importance. Il faut modifier les valeurs pour le premier connecteur (eth0) et pour le second (eth1).
sudo ethtool -E eth0 magic 0x15638086 offset 0x242 value 0x0a
sudo ethtool -E eth0 magic 0x15638086 offset 0x243 value 0x00
sudo ethtool -E eth1 magic 0x15638086 offset 0x242 value 0x0a
sudo ethtool -E eth1 magic 0x15638086 offset 0x243 value 0x00
Normalement, une fois les commandes tapées, il suffit de redémarrer pour vérifier que le changement a bien été pris en compte. Et si c’est bon, la carte devrait marcher sous macOS avec les pilotes de Small Tree.
Avec une carte X520 dotée d’une seule prise SFP+, le fonctionnement est à peu près le même. La carte se nomme ens1
, ces identifiants sont 8086:10fb
et 8086:0006
. Les offsets ne sont pas les mêmes : 0x32A
et 0x32B
. Comme il n’y a qu’une prise, il n’y a que deux lignes.
sudo apt-get install ethtool
ip link show
sudo ethtool -e eth0 raw on > eth0.bin
lspci -nn -vvv | grep Ethernet
sudo ethtool -E ens1 magic 0x10fb8086 offset 0x32a value 0x0a
sudo ethtool -E ens1 magic 0x10fb8086 offset 0x32b value 0x00
Dans les deux cas, les cartes fonctionnent sous macOS Catalina, avec AirPlay 2 et a priori sans plantages. En cas de soucis, il suffit de faire la même manipulation avec les valeurs d’origines.
Tiens c’est marrant j’ai flashé avec une autre méthode..
J’avais d’abord en 2012 commencé par acheter chez SmallTree 2 cartes 10 Gbits qui m’avaient coûté un rein : pas loin de $1700 pour 2 cartes, pour 2 Mac Pro 2010.
Puis en 2015 j’ai eu besoin de 2 cartes supplentaires, j’ai donc acheté 2 Intel X540 neuves (tout de suite mieux : ~200€).
J’avais extrait le firmware SmallTree et Intel, et je n’avais pas détecté de différence dans le susbsytem ID qui étaient les mêmes entre la smalltree et la Intel X540 d’origine..
Par contre il y avait une chaine de code (une sorte de « clé » de signature) présent dans le firmware smalltree mais pas dans l’intel.
du coup j’avais simplement pris le firmware Smalltree, modifié l’adresse MAC et reflashé la Intel avec.
Deux anecdotes :
1- le support SmallTree est top : ils m’avaient bien aidé à améliorer les débits en réglant les valeurs de buffer de macOS x (kern.ipc.maxsockbuf, net.inet.tcp.sendspace et net.inet.tcp.recvspace)
2- j’avais voulu recommencer en 2017 et on ne trouvait quasi plus de X540 neuve (les X550 étaient sortis), du coup j’ai acheté sur ebay… un clone chinois ! Je me suis fait complètement avoir… très bien réalisé, mais totalement incompatible :-(
A noter que les X540 chauffent beaucoup.
Si on compare les cartes :
– les Intel X520 SFP sont en lithographie 40nm et consomment ~6W
– les Intel X540 sont en lithographie 40nm et celle à 1 port RJ45 consomme ~12W
– les Intel X550 sont en lithographie 28nm et celle à 1 port RJ45 consomme ~8W
– les cartes Aquantia à base de AQC107 et transceiver AQR105 sont dans les ~6W
– les cartes à base de TN4010, qu’elles aient le transceiver Aquatia AQR105 ou le Maxwell Alasaka sont dans les ~6,5W
Et pour finir, je ne suis pas sûr de comprendre : avec la carte Intel X550 Airplay 2 fonctionne, même en Thunderbolt ?