Re: [Qemu-devel] e1000 patch for osx
On Wed, Oct 30, 2013 at 6:31 PM, jacek burghardt wrote: I got this error hw/net/e1000.c: In function 'set_phy_ctrl': hw/net/e1000.c:209:10: warning: implicit declaration of function 'set_ics' [-Wimplicit-function-declaration] That's because set_ics needs to be declared before being used in set_phy_ctrl(). A full patch which builds on the current qemu git master would look like below. That being said, now it builds, but doesn't actually make osx (10.6 in my case) start with a working network interface. I still need to bounce the link (via set_link foo off; set_link foo on) from the qemu monitor command line in order to get network access from osx. --Gabriel diff --git a/hw/net/e1000.c b/hw/net/e1000.c index 70a59fd..7c2dd9f 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -186,6 +186,9 @@ e1000_link_up(E1000State *s) s-phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS; } +//FIXME: maybe move set_phy_ctrl *after* set_ics instead ? +static void set_ics(E1000State *s, int index, uint32_t val); + static void set_phy_ctrl(E1000State *s, int index, uint16_t val) { @@ -203,6 +206,12 @@ set_phy_ctrl(E1000State *s, int index, uint16_t val) DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + +if (val 0x8000) { +val = 0x7fff; +set_ics(s, 0, E1000_ICR_LSC); +} +s-phy_reg[PHY_CTRL] = val; } static void @@ -445,8 +454,9 @@ set_mdic(E1000State *s, int index, uint32_t val) } else { if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); +} else { +s-phy_reg[addr] = data; } -s-phy_reg[addr] = data; } } s-mac_reg[MDIC] = val | E1000_MDIC_READY;
Re: [Qemu-devel] e1000 patch for osx
I will test this with 10.8.3
Re: [Qemu-devel] e1000 patch for osx
On Fri, Oct 25, 2013 at 08:27:27AM -0600, jacek burghardt wrote: https://github.com/saucelabs/mac-osx-on-kvm/blob/master/e1000-mac-hacks.patch -} else -s-phy_reg[addr] = data; +} else { +/* some (reset) bits are self clearing, so better clear them */ +switch (addr) { +case PHY_CTRL: +s-phy_reg[addr] = data 0x7eff; +if (s-phy_reg[addr] != data) +set_ics(s, 0, E1000_ICR_LSC); +break; +default: +s-phy_reg[addr] = data; +} +} Patches welcome! Please see: http://qemu-project.org/Contribute/SubmitAPatch I suggest you contact the author of this patch and ask them to submit it. Stefan
Re: [Qemu-devel] e1000 patch for osx
Well I was hoping anyone could port the patch to qemu it seems the code changed a lot in one year
Re: [Qemu-devel] e1000 patch for osx
Am 30.10.2013 14:26, schrieb jacek burghardt: Well I was hoping anyone could port the patch to qemu it seems the code changed a lot in one year Problem is that the patch you referenced does not have a Signed-off-by. We can't just rebase and apply it without contacting the author. Some minor nits in there btw, including missing braces and spaces around +. Regards, Andreas -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
Re: [Qemu-devel] e1000 patch for osx
Il 25/10/2013 15:53, jacek burghardt ha scritto: Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed. Does this patch work? diff --git a/hw/net/e1000.c b/hw/net/e1000.c index 70a59fd..a9ce08f 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -203,6 +203,11 @@ set_phy_ctrl(E1000State *s, int index, uint16_t val) DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + +if (val 0x8000) { +val = 0x7fff; +set_ics(s, 0, E1000_ICR_LSC); +} } static void @@ -445,8 +450,9 @@ set_mdic(E1000State *s, int index, uint32_t val) } else { if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); +} else { +s-phy_reg[addr] = data; } -s-phy_reg[addr] = data; } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; Paolo
Re: [Qemu-devel] e1000 patch for osx
On 30 October 2013 16:52, Paolo Bonzini pbonz...@redhat.com wrote: Il 25/10/2013 15:53, jacek burghardt ha scritto: Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed. Does this patch work? diff --git a/hw/net/e1000.c b/hw/net/e1000.c index 70a59fd..a9ce08f 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -203,6 +203,11 @@ set_phy_ctrl(E1000State *s, int index, uint16_t val) DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + +if (val 0x8000) { +val = 0x7fff; +set_ics(s, 0, E1000_ICR_LSC); +} This looks odd -- you seem to be modifying val but then not using the modified value before we reach the end of the function. } static void @@ -445,8 +450,9 @@ set_mdic(E1000State *s, int index, uint32_t val) } else { if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); +} else { +s-phy_reg[addr] = data; } -s-phy_reg[addr] = data; } ...and this part seems to remove the code which sets phy_reg[PHY_CTRL], so it will now always read back as zero. thanks -- PMM
Re: [Qemu-devel] e1000 patch for osx
The function of this patch is initialize emulated network card and pass data just like Mac firmware
Re: [Qemu-devel] e1000 patch for osx
Il 30/10/2013 18:29, Peter Maydell ha scritto: This looks odd -- you seem to be modifying val but then not using the modified value before we reach the end of the function. } static void @@ -445,8 +450,9 @@ set_mdic(E1000State *s, int index, uint32_t val) } else { if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); +} else { +s-phy_reg[addr] = data; } -s-phy_reg[addr] = data; } ...and this part seems to remove the code which sets phy_reg[PHY_CTRL], so it will now always read back as zero. Yeah, I forgot one line: diff --git a/hw/net/e1000.c b/hw/net/e1000.c index 70a59fd..b7a1953 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -203,6 +203,12 @@ set_phy_ctrl(E1000State *s, int index, uint16_t val) DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + +if (val 0x8000) { +val = 0x7fff; +set_ics(s, 0, E1000_ICR_LSC); +} +s-phy_reg[PHY_CTRL] = val; } static void @@ -445,8 +451,9 @@ set_mdic(E1000State *s, int index, uint32_t val) } else { if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); +} else { +s-phy_reg[addr] = data; } -s-phy_reg[addr] = data; } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; Paolo
Re: [Qemu-devel] e1000 patch for osx
I wonder if anyone can post reworked patch to latest qemu On Fri, Oct 25, 2013 at 8:27 AM, jacek burghardt jaceksburgha...@gmail.comwrote: https://github.com/saucelabs/mac-osx-on-kvm/blob/master/e1000-mac-hacks.patch -} else -s-phy_reg[addr] = data; +} else { +/* some (reset) bits are self clearing, so better clear them */ +switch (addr) { +case PHY_CTRL: +s-phy_reg[addr] = data 0x7eff; +if (s-phy_reg[addr] != data) +set_ics(s, 0, E1000_ICR_LSC); +break; +default: +s-phy_reg[addr] = data; +} +} On Fri, Oct 25, 2013 at 8:21 AM, Paolo Bonzini pbonz...@redhat.comwrote: Il 25/10/2013 14:53, jacek burghardt ha scritto: Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed. Which patch was that? Paolo
Re: [Qemu-devel] e1000 patch for osx
Il 31/10/2013 00:54, jacek burghardt ha scritto: I wonder if anyone can post reworked patch to latest qemu That's what I did 5 hours ago, though what I did was actually to look at the bits affected by the patch and reimplement them based on the e1000 hardware spec. Can you test the second patch I posted and see if it works for you? Paolo
Re: [Qemu-devel] e1000 patch for osx
I am in process of recompiling qemu right now I came up with this patch is this correct diff -Naur qemu/hw/net/e1000.c qemu-a/hw/net/e1000.c --- qemu/hw/net/e1000.c 2013-10-27 15:36:05.496526538 -0600 +++ qemu-a/hw/net/e1000.c 2013-10-30 18:09:03.101711694 -0600 @@ -203,6 +203,12 @@ DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + + if (val 0x8000) { + val = 0x7fff; + set_ics(s, 0, E1000_ICR_LSC); + } + s-phy_reg[PHY_CTRL] = val; } static void @@ -390,6 +396,8 @@ d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; if (qemu_get_queue(d-nic)-link_down) { e1000_link_down(d); } @@ -409,6 +417,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); } static void @@ -446,7 +456,15 @@ if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); } -s-phy_reg[addr] = data; +switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; + if (s-phy_reg[addr] != data) + set_ics(s, 0, E1000_ICR_LSC); + break; + default: + s-phy_reg[addr] = data; + } } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; @@ -1163,8 +1181,13 @@ static void set_ims(E1000State *s, int index, uint32_t val) { +uint32_t old_val = s-mac_reg[IMS]; s-mac_reg[IMS] |= val; -set_ics(s, 0, 0); +if ((val E1000_ICR_LSC) old_val == 0) { + set_ics(s, 0, E1000_ICR_LSC); /* inject Link Status for uncooperative Darwin driver */ +} else { + set_ics(s, 0, 0); +} } #define getreg(x) [x] = mac_readreg @@ -1192,7 +1215,7 @@ static void (*macreg_writeops[])(E1000State *, int, uint32_t) = { putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC), putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH), -putreg(RDBAL), putreg(LEDCTL), putreg(VET), +putreg(RDBAL), putreg(LEDCTL), putreg(VET),putreg(MANC), [TDLEN] = set_dlen,[RDLEN] = set_dlen, [TCTL] = set_tctl, [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics, [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt, On Wed, Oct 30, 2013 at 6:00 PM, Paolo Bonzini pbonz...@redhat.com wrote: Il 31/10/2013 00:54, jacek burghardt ha scritto: I wonder if anyone can post reworked patch to latest qemu That's what I did 5 hours ago, though what I did was actually to look at the bits affected by the patch and reimplement them based on the e1000 hardware spec. Can you test the second patch I posted and see if it works for you? Paolo
Re: [Qemu-devel] e1000 patch for osx
i got this error hw/net/e1000.c: In function 'set_phy_ctrl': hw/net/e1000.c:209:10: warning: implicit declaration of function 'set_ics' [-Wimplicit-function-declaration] set_ics(s, 0, E1000_ICR_LSC); ^ hw/net/e1000.c:209:10: warning: nested extern declaration of 'set_ics' [-Wnested-externs] hw/net/e1000.c: At top level: hw/net/e1000.c:351:1: warning: conflicting types for 'set_ics' [enabled by default] set_ics(E1000State *s, int index, uint32_t val) ^ hw/net/e1000.c:351:1: error: static declaration of 'set_ics' follows non-static declaration hw/net/e1000.c:209:10: note: previous implicit declaration of 'set_ics' was here set_ics(s, 0, E1000_ICR_LSC); ^ /data/dev/xen/xen-git/src/xen-build/tools/qemu-xen-dir/rules.mak:25: recipe for target 'hw/net/e1000.o' failed On Wed, Oct 30, 2013 at 6:21 PM, jacek burghardt jaceksburgha...@gmail.comwrote: I am in process of recompiling qemu right now I came up with this patch is this correct diff -Naur qemu/hw/net/e1000.c qemu-a/hw/net/e1000.c --- qemu/hw/net/e1000.c 2013-10-27 15:36:05.496526538 -0600 +++ qemu-a/hw/net/e1000.c 2013-10-30 18:09:03.101711694 -0600 @@ -203,6 +203,12 @@ DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + + if (val 0x8000) { + val = 0x7fff; + set_ics(s, 0, E1000_ICR_LSC); + } + s-phy_reg[PHY_CTRL] = val; } static void @@ -390,6 +396,8 @@ d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; if (qemu_get_queue(d-nic)-link_down) { e1000_link_down(d); } @@ -409,6 +417,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); } static void @@ -446,7 +456,15 @@ if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); } -s-phy_reg[addr] = data; +switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; + if (s-phy_reg[addr] != data) + set_ics(s, 0, E1000_ICR_LSC); + break; + default: + s-phy_reg[addr] = data; + } } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; @@ -1163,8 +1181,13 @@ static void set_ims(E1000State *s, int index, uint32_t val) { +uint32_t old_val = s-mac_reg[IMS]; s-mac_reg[IMS] |= val; -set_ics(s, 0, 0); +if ((val E1000_ICR_LSC) old_val == 0) { + set_ics(s, 0, E1000_ICR_LSC); /* inject Link Status for uncooperative Darwin driver */ +} else { + set_ics(s, 0, 0); +} } #define getreg(x) [x] = mac_readreg @@ -1192,7 +1215,7 @@ static void (*macreg_writeops[])(E1000State *, int, uint32_t) = { putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC), putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH), -putreg(RDBAL), putreg(LEDCTL), putreg(VET), +putreg(RDBAL), putreg(LEDCTL), putreg(VET),putreg(MANC), [TDLEN] = set_dlen,[RDLEN] = set_dlen, [TCTL] = set_tctl, [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics, [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt, On Wed, Oct 30, 2013 at 6:00 PM, Paolo Bonzini pbonz...@redhat.comwrote: Il 31/10/2013 00:54, jacek burghardt ha scritto: I wonder if anyone can post reworked patch to latest qemu That's what I did 5 hours ago, though what I did was actually to look at the bits affected by the patch and reimplement them based on the e1000 hardware spec. Can you test the second patch I posted and see if it works for you? Paolo
Re: [Qemu-devel] e1000 patch for osx
Il 31/10/2013 01:21, jacek burghardt ha scritto: I am in process of recompiling qemu right now I came up with this patch is this correct diff -Naur qemu/hw/net/e1000.c qemu-a/hw/net/e1000.c --- qemu/hw/net/e1000.c 2013-10-27 15:36:05.496526538 -0600 +++ qemu-a/hw/net/e1000.c 2013-10-30 18:09:03.101711694 -0600 @@ -203,6 +203,12 @@ DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + + if (val 0x8000) { + val = 0x7fff; + set_ics(s, 0, E1000_ICR_LSC); + } + s-phy_reg[PHY_CTRL] = val; } static void @@ -390,6 +396,8 @@ d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; if (qemu_get_queue(d-nic)-link_down) { e1000_link_down(d); } @@ -409,6 +417,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); Are these two lines necessary? } static void @@ -446,7 +456,15 @@ if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); } -s-phy_reg[addr] = data; +switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; Does it work if you put 0x7fff here? Paolo
Re: [Qemu-devel] e1000 patch for osx
I will try that the original patch: --- qemu-kvm-0.12.5/hw/e1000.c.vanilla 2011-02-19 12:28:38.0 + +++ qemu-kvm-0.12.5/hw/e1000.c 2011-02-21 14:11:33.0 + @@ -199,6 +202,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); } static void @@ -231,8 +236,18 @@ if (!(phy_regcap[addr] PHY_W)) { DBGOUT(MDIC, MDIC write reg %x unhandled\n, addr); val |= E1000_MDIC_ERROR; -} else -s-phy_reg[addr] = data; +} else { + /* some (reset) bits are self clearing, so better clear them */ + switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; + if (s-phy_reg[addr] != data) + set_ics(s, 0, E1000_ICR_LSC); + break; + default: + s-phy_reg[addr] = data; + } + } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; DBGOUT(MDIC, mac_reg[MDIC] = %x\n, s-mac_reg[MDIC]); @@ -802,8 +807,13 @@ static void set_ims(E1000State *s, int index, uint32_t val) { +uint32_t old_val = s-mac_reg[IMS]; s-mac_reg[IMS] |= val; -set_ics(s, 0, 0); +if ((val E1000_ICR_LSC) old_val == 0) { + set_ics(s, 0, E1000_ICR_LSC); /* inject Link Status for uncooperative Darwin driver */ +} else { + set_ics(s, 0, 0); +} } #define getreg(x) [x] = mac_readreg @@ -810,7 +825,7 @@ static void (*macreg_writeops[])(E1000State *, int, uint32_t) = { putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC), putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH), -putreg(RDBAL), putreg(LEDCTL), putreg(VET), +putreg(RDBAL), putreg(LEDCTL), putreg(VET),putreg(MANC), [TDLEN] = set_dlen,[RDLEN] = set_dlen, [TCTL] = set_tctl, [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics, [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt, @@ -1059,6 +1059,7 @@ static void e1000_reset(void *opaque) { E1000State *d = opaque; +uint8_t *macaddr = d-eeprom_data; memset(d-phy_reg, 0, sizeof d-phy_reg); memmove(d-phy_reg, phy_reg_init, sizeof phy_reg_init); @@ -1066,6 +1067,9 @@ memmove(d-mac_reg, mac_reg_init, sizeof mac_reg_init); d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); + +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; } static NetClientInfo net_e1000_info = { On Wed, Oct 30, 2013 at 6:27 PM, Paolo Bonzini pbonz...@redhat.com wrote: Il 31/10/2013 01:21, jacek burghardt ha scritto: I am in process of recompiling qemu right now I came up with this patch is this correct diff -Naur qemu/hw/net/e1000.c qemu-a/hw/net/e1000.c --- qemu/hw/net/e1000.c 2013-10-27 15:36:05.496526538 -0600 +++ qemu-a/hw/net/e1000.c 2013-10-30 18:09:03.101711694 -0600 @@ -203,6 +203,12 @@ DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + + if (val 0x8000) { + val = 0x7fff; + set_ics(s, 0, E1000_ICR_LSC); + } + s-phy_reg[PHY_CTRL] = val; } static void @@ -390,6 +396,8 @@ d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; if (qemu_get_queue(d-nic)-link_down) { e1000_link_down(d); } @@ -409,6 +417,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); Are these two lines necessary? } static void @@ -446,7 +456,15 @@ if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); } -s-phy_reg[addr] = data; +switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; Does it work if you put 0x7fff here? Paolo
Re: [Qemu-devel] e1000 patch for osx
I got this error hw/net/e1000.c: In function 'set_phy_ctrl': hw/net/e1000.c:209:10: warning: implicit declaration of function 'set_ics' [-Wimplicit-function-declaration] set_ics(s, 0, E1000_ICR_LSC); ^ hw/net/e1000.c:209:10: warning: nested extern declaration of 'set_ics' [-Wnested-externs] hw/net/e1000.c: At top level: hw/net/e1000.c:351:1: warning: conflicting types for 'set_ics' [enabled by default] set_ics(E1000State *s, int index, uint32_t val) ^ hw/net/e1000.c:351:1: error: static declaration of 'set_ics' follows non-static declaration hw/net/e1000.c:209:10: note: previous implicit declaration of 'set_ics' was here set_ics(s, 0, E1000_ICR_LSC); On Wed, Oct 30, 2013 at 6:31 PM, jacek burghardt jaceksburgha...@gmail.comwrote: I will try that the original patch: --- qemu-kvm-0.12.5/hw/e1000.c.vanilla 2011-02-19 12:28:38.0 + +++ qemu-kvm-0.12.5/hw/e1000.c2011-02-21 14:11:33.0 + @@ -199,6 +202,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); } static void @@ -231,8 +236,18 @@ if (!(phy_regcap[addr] PHY_W)) { DBGOUT(MDIC, MDIC write reg %x unhandled\n, addr); val |= E1000_MDIC_ERROR; -} else -s-phy_reg[addr] = data; +} else { + /* some (reset) bits are self clearing, so better clear them */ + switch (addr) { + case PHY_CTRL: + s-phy_reg[addr] = data 0x7eff; + if (s-phy_reg[addr] != data) + set_ics(s, 0, E1000_ICR_LSC); + break; + default: + s-phy_reg[addr] = data; + } + } } s-mac_reg[MDIC] = val | E1000_MDIC_READY; DBGOUT(MDIC, mac_reg[MDIC] = %x\n, s-mac_reg[MDIC]); @@ -802,8 +807,13 @@ static void set_ims(E1000State *s, int index, uint32_t val) { +uint32_t old_val = s-mac_reg[IMS]; s-mac_reg[IMS] |= val; -set_ics(s, 0, 0); +if ((val E1000_ICR_LSC) old_val == 0) { + set_ics(s, 0, E1000_ICR_LSC); /* inject Link Status for uncooperative Darwin driver */ +} else { + set_ics(s, 0, 0); +} } #define getreg(x)[x] = mac_readreg @@ -810,7 +825,7 @@ static void (*macreg_writeops[])(E1000State *, int, uint32_t) = { putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC), putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH), -putreg(RDBAL), putreg(LEDCTL), putreg(VET), +putreg(RDBAL), putreg(LEDCTL), putreg(VET),putreg(MANC), [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl, [TDT] = set_tctl,[MDIC] = set_mdic, [ICS] = set_ics, [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt, @@ -1059,6 +1059,7 @@ static void e1000_reset(void *opaque) { E1000State *d = opaque; +uint8_t *macaddr = d-eeprom_data; memset(d-phy_reg, 0, sizeof d-phy_reg); memmove(d-phy_reg, phy_reg_init, sizeof phy_reg_init); @@ -1066,6 +1067,9 @@ memmove(d-mac_reg, mac_reg_init, sizeof mac_reg_init); d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); + +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; } static NetClientInfo net_e1000_info = { On Wed, Oct 30, 2013 at 6:27 PM, Paolo Bonzini pbonz...@redhat.comwrote: Il 31/10/2013 01:21, jacek burghardt ha scritto: I am in process of recompiling qemu right now I came up with this patch is this correct diff -Naur qemu/hw/net/e1000.c qemu-a/hw/net/e1000.c --- qemu/hw/net/e1000.c 2013-10-27 15:36:05.496526538 -0600 +++ qemu-a/hw/net/e1000.c 2013-10-30 18:09:03.101711694 -0600 @@ -203,6 +203,12 @@ DBGOUT(PHY, Start link auto negotiation\n); timer_mod(s-autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } + + if (val 0x8000) { + val = 0x7fff; + set_ics(s, 0, E1000_ICR_LSC); + } + s-phy_reg[PHY_CTRL] = val; } static void @@ -390,6 +396,8 @@ d-rxbuf_min_shift = 1; memset(d-tx, 0, sizeof d-tx); +d-mac_reg[RA+0] = (macaddr[3] 24) | (macaddr[2] 16) | (macaddr[1] 8) | macaddr[0]; +d-mac_reg[RA+1] = E1000_RAH_AV | (macaddr[5] 8) | macaddr[4]; if (qemu_get_queue(d-nic)-link_down) { e1000_link_down(d); } @@ -409,6 +417,8 @@ { /* RST is self clearing */ s-mac_reg[CTRL] = val ~E1000_CTRL_RST; +if (val E1000_CTRL_RST) + set_ics(s, 0, E1000_ICR_LSC); Are these two lines necessary? } static void @@ -446,7 +456,15 @@ if (addr NPHYWRITEOPS phyreg_writeops[addr]) { phyreg_writeops[addr](s, index, data); } -
[Qemu-devel] e1000 patch for osx
Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed.
Re: [Qemu-devel] e1000 patch for osx
Il 25/10/2013 14:53, jacek burghardt ha scritto: Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed. Which patch was that? Paolo
Re: [Qemu-devel] e1000 patch for osx
https://github.com/saucelabs/mac-osx-on-kvm/blob/master/e1000-mac-hacks.patch -} else -s-phy_reg[addr] = data; +} else { +/* some (reset) bits are self clearing, so better clear them */ +switch (addr) { +case PHY_CTRL: +s-phy_reg[addr] = data 0x7eff; +if (s-phy_reg[addr] != data) +set_ics(s, 0, E1000_ICR_LSC); +break; +default: +s-phy_reg[addr] = data; +} +} On Fri, Oct 25, 2013 at 8:21 AM, Paolo Bonzini pbonz...@redhat.com wrote: Il 25/10/2013 14:53, jacek burghardt ha scritto: Is there a patch for qemu git master that pre init e1000 so I can get rid off unpluged network cable message ? I know there is patch but is is for older version of qemu and it seeem that it no longer functions and does not apply fully as code was changed. Which patch was that? Paolo