Re: [Qemu-devel] e1000 patch for osx

2013-10-31 Thread Gabriel L. Somlo
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

2013-10-31 Thread jacek burghardt
I will test this with 10.8.3


Re: [Qemu-devel] e1000 patch for osx

2013-10-30 Thread Stefan Hajnoczi
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

2013-10-30 Thread jacek burghardt
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

2013-10-30 Thread Andreas Färber
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

2013-10-30 Thread Paolo Bonzini
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

2013-10-30 Thread Peter Maydell
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

2013-10-30 Thread jacek burghardt
The function of this patch is initialize emulated network card and pass
data just like Mac firmware


Re: [Qemu-devel] e1000 patch for osx

2013-10-30 Thread Paolo Bonzini
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

2013-10-30 Thread jacek burghardt
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

2013-10-30 Thread Paolo Bonzini
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

2013-10-30 Thread jacek burghardt
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

2013-10-30 Thread jacek burghardt
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

2013-10-30 Thread Paolo Bonzini
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

2013-10-30 Thread jacek burghardt
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

2013-10-30 Thread jacek burghardt
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

2013-10-25 Thread jacek burghardt
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

2013-10-25 Thread Paolo Bonzini
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

2013-10-25 Thread jacek burghardt
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