Hacker une carte Ethernet 10 Gb/s Intel pour macOS

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.

La X550

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.

La X520

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.

Les pilotes chargent


La carte en RJ45


Celle en SFP+