Thanks to rotvogel for pointing me at the culprit. I haven't got 100% of what I wanted - hotplug isn't working out, but my cards stay where they are supposed to now. The solution is a total hack, but what can you expect from someone with four hours of shell scripting experience?
Solution:
1. Add tg3 and prism54 to /etc/hotplug/blacklist
2. Add alias lines to /etc/modprobe.conf
alias eth0 tg3
alias eth1 prism54
Be sure to align these values with the desired MAC placement in (3).
3. Add a config variable to /etc/rc.d/rc.inet1.conf :
# Config information for eth0:
IPADDR[0]=""
NETMASK[0]=""
USE_DHCP[0]="yes"
DHCP_HOSTNAME[0]=""
MACADDR[0]="00:08:02:EF:2C:53" # Add this line for each card. Put your MAC in here.
# Config information for eth1:
IPADDR[1]=""
NETMASK[1]=""
USE_DHCP[1]="yes"
DHCP_HOSTNAME[1]=""
MACADDR[1]="00:09:5B:79
2:C6"
# Config information for eth2:
IPADDR[1]=""
NETMASK[1]=""
USE_DHCP[1]=""
DHCP_HOSTNAME[1]=""
MACADDR[1]="" # use empty string for non-configured cards
4. Add some code to /etc/rc.d/rc.inet1 :
( I know, I should learn to use diff and patch - maybe tomorrow)
Position in original code:
if grep eth${1}: /proc/net/dev 1> /dev/null ; then # interface exists
if ! /sbin/ifconfig | grep -w "eth${1}" 1>/dev/null || \
! /sbin/ifconfig eth${1} | grep "inet addr" 1> /dev/null ; then # interface not up or not configured
New code goes in right after the lines above:
<NEW>
echo "/etc/rc.d/rc.inet1: /sbin/nameif eth${1} ${MACADDR[$1]}" | $LOGGER
if [ ! "${MACADDR[$1]}" = "" ]; then
/sbin/nameif eth${1} ${MACADDR[$1]}
fi
</NEW>
5. If you have wireless cards make sure to configure them in /etc/rc.d/rc.wireless.conf
This will probably break something else, but so far it seems to work OK for me. I have only tested the following use cases:
1. Boot machine w/o prism54 - tg3 gets eth0
2. Boot machine w/ prism54 - tg3 gets eth0, prism54 gets eth1
3. Restart network w/ tg3 only - tg3 gets eth0
4. Restart network w/ both - tg3 gets eth0, prism54 gets eth1