110 lines
3.3 KiB
Diff
110 lines
3.3 KiB
Diff
|
# Fix the Link detection in MacOS
|
||
|
# Author Alex Graf - agraf@suse
|
||
|
Index: kvm-75/qemu/hw/rtl8139.c
|
||
|
===================================================================
|
||
|
--- kvm-75.orig/qemu/hw/rtl8139.c
|
||
|
+++ kvm-75/qemu/hw/rtl8139.c
|
||
|
@@ -422,6 +422,9 @@ static void RTL8139TallyCounters_load(QE
|
||
|
/* Saves values of tally counters to VM state file */
|
||
|
static void RTL8139TallyCounters_save(QEMUFile* f, RTL8139TallyCounters *tally_counters);
|
||
|
|
||
|
+static uint32_t rtl8139_io_readb(void *opaque, uint8_t addr);
|
||
|
+static uint32_t rtl8139_io_readw(void *opaque, uint8_t addr);
|
||
|
+
|
||
|
typedef struct RTL8139State {
|
||
|
uint8_t phys[8]; /* mac address */
|
||
|
uint8_t mult[8]; /* multicast mask array */
|
||
|
@@ -462,6 +465,7 @@ typedef struct RTL8139State {
|
||
|
|
||
|
uint16_t CpCmd;
|
||
|
uint8_t TxThresh;
|
||
|
+ enum NICLink link;
|
||
|
|
||
|
PCIDevice *pci_dev;
|
||
|
VLANClientState *vc;
|
||
|
@@ -1227,7 +1231,7 @@ static void rtl8139_reset(RTL8139State *
|
||
|
s->Config0 = 0x0; /* No boot ROM */
|
||
|
s->Config1 = 0xC; /* IO mapped and MEM mapped registers available */
|
||
|
s->Config3 = 0x1; /* fast back-to-back compatible */
|
||
|
- s->Config5 = 0x0;
|
||
|
+ s->Config5 = Cfg5_LDPS;
|
||
|
|
||
|
s->CSCR = CSCR_F_LINK_100 | CSCR_HEART_BIT | CSCR_LD;
|
||
|
|
||
|
@@ -1251,6 +1255,13 @@ static void rtl8139_reset(RTL8139State *
|
||
|
s->TimerInt = 0;
|
||
|
s->TCTR_base = 0;
|
||
|
|
||
|
+ s->eeprom.contents[10] = s->Config0 | s->Config1 << 8;
|
||
|
+ s->eeprom.contents[6] = (rtl8139_io_readb(s, MediaStatus) & 0xc0) | ((rtl8139_io_readw(s, BasicModeCtrl) >> 8) & 0x23)
|
||
|
+ | (s->Config3 << 8);
|
||
|
+ s->eeprom.contents[12] = s->Config4 << 8;
|
||
|
+
|
||
|
+ s->eeprom.contents[15] = s->Config5 << 8;
|
||
|
+
|
||
|
/* reset tally counters */
|
||
|
RTL8139TallyCounters_clear(&s->tally_counters);
|
||
|
}
|
||
|
@@ -2846,7 +2857,7 @@ static uint32_t rtl8139_io_readb(void *o
|
||
|
break;
|
||
|
|
||
|
case MediaStatus:
|
||
|
- ret = 0xd0;
|
||
|
+ ret = 0xd0 | ((s->link == Link_10mbps) << 3);
|
||
|
DEBUG_PRINT(("RTL8139: MediaStatus read 0x%x\n", ret));
|
||
|
break;
|
||
|
|
||
|
@@ -3440,6 +3451,15 @@ PCIDevice *pci_rtl8139_init(PCIBus *bus,
|
||
|
|
||
|
s->pci_dev = (PCIDevice *)d;
|
||
|
memcpy(s->macaddr, nd->macaddr, 6);
|
||
|
+ switch(nd->link) {
|
||
|
+ case Link_10mbps:
|
||
|
+ case Link_100mbps:
|
||
|
+ s->link = nd->link;
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ s->link = Link_100mbps;
|
||
|
+ break;
|
||
|
+ }
|
||
|
rtl8139_reset(s);
|
||
|
s->vc = qemu_new_vlan_client(nd->vlan, rtl8139_receive,
|
||
|
rtl8139_can_receive, s);
|
||
|
Index: kvm-75/qemu/net.h
|
||
|
===================================================================
|
||
|
--- kvm-75.orig/qemu/net.h
|
||
|
+++ kvm-75/qemu/net.h
|
||
|
@@ -55,12 +55,20 @@ void net_client_uninit(NICInfo *nd);
|
||
|
|
||
|
#define MAX_NICS 8
|
||
|
|
||
|
+enum NICLink {
|
||
|
+ Link_default,
|
||
|
+ Link_10mbps,
|
||
|
+ Link_100mbps,
|
||
|
+ Link_1000mbps,
|
||
|
+};
|
||
|
+
|
||
|
struct NICInfo {
|
||
|
uint8_t macaddr[6];
|
||
|
const char *model;
|
||
|
VLANState *vlan;
|
||
|
int devfn;
|
||
|
int used;
|
||
|
+ enum NICLink link;
|
||
|
};
|
||
|
|
||
|
extern int nb_nics;
|
||
|
Index: kvm-75/qemu/vl.c
|
||
|
===================================================================
|
||
|
--- kvm-75.orig/qemu/vl.c
|
||
|
+++ kvm-75/qemu/vl.c
|
||
|
@@ -5555,6 +5555,7 @@ int net_client_init(const char *device,
|
||
|
}
|
||
|
nd->vlan = vlan;
|
||
|
nd->used = 1;
|
||
|
+ nd->link = Link_default;
|
||
|
nb_nics++;
|
||
|
vlan->nb_guest_devs++;
|
||
|
ret = idx;
|