diff --git a/src/include/86box/network.h b/src/include/86box/network.h index 54181ae8e..4f9e6b70e 100644 --- a/src/include/86box/network.h +++ b/src/include/86box/network.h @@ -62,6 +62,9 @@ #define NET_CARD_MAX 4 #define NET_HOST_INTF_MAX 64 +#define NET_PERIOD_10M 0.8 +#define NET_PERIOD_100M 0.08 + /* Supported network cards. */ enum { NONE = 0, @@ -128,6 +131,7 @@ struct _netcard_t { mutex_t *rx_mutex; pc_timer_t timer; int card_num; + double byte_period; }; typedef struct { diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index 25ced4679..2b2b22540 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -2025,11 +2025,15 @@ pcnet_bcr_writew(nic_t *dev, uint16_t rap, uint16_t val) case BCR_BSBC: case BCR_EECAS: case BCR_PLAT: - case BCR_MIICAS: case BCR_MIIADDR: dev->aBCR[rap] = val; break; + case BCR_MIICAS: + dev->netcard->byte_period = (dev->board == DEV_AM79C973 && (val & 0x28)) ? NET_PERIOD_100M : NET_PERIOD_10M; + dev->aBCR[rap] = val; + break; + case BCR_STVAL: val &= 0xffff; dev->aBCR[BCR_STVAL] = val; @@ -3055,6 +3059,7 @@ pcnet_init(const device_t *info) /* Attach ourselves to the network module. */ dev->netcard = network_attach(dev, dev->aPROM, pcnetReceiveNoSync, pcnetWaitReceiveAvail, pcnetSetLinkState); + dev->netcard->byte_period = (dev->board == DEV_AM79C973) ? NET_PERIOD_100M : NET_PERIOD_10M; timer_add(&dev->timer, pcnetPollTimer, dev, 0); diff --git a/src/network/network.c b/src/network/network.c index a01eb938e..a8106afeb 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -379,7 +379,7 @@ network_rx_queue(void *priv) card->host_drv.notify_in(card->host_drv.priv); } - double timer_period = 0.762939453125 * (rx_bytes > tx_bytes ? rx_bytes : tx_bytes); + double timer_period = card->byte_period * (rx_bytes > tx_bytes ? rx_bytes : tx_bytes); if (timer_period < 200) timer_period = 200; @@ -409,6 +409,7 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETL card->tx_mutex = thread_create_mutex(); card->rx_mutex = thread_create_mutex(); card->card_num = net_card_current; + card->byte_period = NET_PERIOD_10M; for (int i=0; i<3; i++) { network_queue_init(&card->queues[i]); @@ -440,7 +441,7 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETL } timer_add(&card->timer, network_rx_queue, card, 0); - timer_on_auto(&card->timer, 0.762939453125 * 2.0); + timer_on_auto(&card->timer, 100); return card; }