pcnet: make subsystem vendor id match hardware

Submitted by Michael S. Tsirkin on March 15, 2010, 1:36 p.m.

Details

Message ID 20100315133650.GA31573@redhat.com
State New
Headers show

Commit Message

Michael S. Tsirkin March 15, 2010, 1:36 p.m.
Real pcnet device (AT2450) apparently has subsystem
device and vendor id set to 0, this is out of spec
(which requires that vendor id is obtained from PCI SIG)
but windows xp driver seems to need this in order
to associate.

qemu sets pci subsystem id to qumranet/qemu
since d350d97d196a632b6c7493acf07a061017fc6f7d,
debian does not yet have this patch.

https://bugzilla.redhat.com/show_bug.cgi?id=521247

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>
---
 hw/pcnet.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

Comments

Jan Kiszka March 16, 2010, 5:10 p.m.
Michael S. Tsirkin wrote:
> Real pcnet device (AT2450) apparently has subsystem
> device and vendor id set to 0, this is out of spec
> (which requires that vendor id is obtained from PCI SIG)
> but windows xp driver seems to need this in order
> to associate.
> 
> qemu sets pci subsystem id to qumranet/qemu
> since d350d97d196a632b6c7493acf07a061017fc6f7d,
> debian does not yet have this patch.
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=521247
> 
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Anthony Liguori <aliguori@us.ibm.com>
> ---
>  hw/pcnet.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/pcnet.c b/hw/pcnet.c
> index 44b5b31..12260be 100644
> --- a/hw/pcnet.c
> +++ b/hw/pcnet.c
> @@ -1997,6 +1997,9 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
>      pci_set_long(pci_conf + PCI_BASE_ADDRESS_0 + 4,
>                   PCI_BASE_ADDRESS_SPACE_MEMORY);
>  
> +    pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, 0x0);
> +    pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0);
> +
>      /* TODO: value must be 0 at RST# */
>      pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
>      pci_conf[PCI_MIN_GNT] = 0x06;

No concerns from my side, still works here.

Jan
Stefan Weil March 16, 2010, 9:29 p.m.
Michael S. Tsirkin schrieb:
> Real pcnet device (AT2450) apparently has subsystem
> device and vendor id set to 0, this is out of spec
> (which requires that vendor id is obtained from PCI SIG)
> but windows xp driver seems to need this in order
> to associate.
>
> qemu sets pci subsystem id to qumranet/qemu
> since d350d97d196a632b6c7493acf07a061017fc6f7d,
> debian does not yet have this patch.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=521247
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Anthony Liguori <aliguori@us.ibm.com>
> ---
>  hw/pcnet.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
>
> diff --git a/hw/pcnet.c b/hw/pcnet.c
> index 44b5b31..12260be 100644
> --- a/hw/pcnet.c
> +++ b/hw/pcnet.c
> @@ -1997,6 +1997,9 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
>      pci_set_long(pci_conf + PCI_BASE_ADDRESS_0 + 4,
>                   PCI_BASE_ADDRESS_SPACE_MEMORY);
>  
> +    pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, 0x0);
> +    pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0);
> +
>      /* TODO: value must be 0 at RST# */
>      pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
>      pci_conf[PCI_MIN_GNT] = 0x06;
>   

Don't you think that a comment in the code
(with the same explanation which you wrote above)
would be helpful in this special case?

Of course one can always call git blame, but
a comment is easier to read.

Regards
Stefan
Michael S. Tsirkin March 17, 2010, 12:33 p.m.
On Tue, Mar 16, 2010 at 10:29:43PM +0100, Stefan Weil wrote:
> Michael S. Tsirkin schrieb:
> > Real pcnet device (AT2450) apparently has subsystem
> > device and vendor id set to 0, this is out of spec
> > (which requires that vendor id is obtained from PCI SIG)
> > but windows xp driver seems to need this in order
> > to associate.
> >
> > qemu sets pci subsystem id to qumranet/qemu
> > since d350d97d196a632b6c7493acf07a061017fc6f7d,
> > debian does not yet have this patch.
> >
> > https://bugzilla.redhat.com/show_bug.cgi?id=521247
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > Cc: Gerd Hoffmann <kraxel@redhat.com>
> > Cc: Anthony Liguori <aliguori@us.ibm.com>
> > ---
> >  hw/pcnet.c |    3 +++
> >  1 files changed, 3 insertions(+), 0 deletions(-)
> >
> > diff --git a/hw/pcnet.c b/hw/pcnet.c
> > index 44b5b31..12260be 100644
> > --- a/hw/pcnet.c
> > +++ b/hw/pcnet.c
> > @@ -1997,6 +1997,9 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
> >      pci_set_long(pci_conf + PCI_BASE_ADDRESS_0 + 4,
> >                   PCI_BASE_ADDRESS_SPACE_MEMORY);
> >  
> > +    pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, 0x0);
> > +    pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0);
> > +
> >      /* TODO: value must be 0 at RST# */
> >      pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
> >      pci_conf[PCI_MIN_GNT] = 0x06;
> >   
> 
> Don't you think that a comment in the code
> (with the same explanation which you wrote above)
> would be helpful in this special case?
> Of course one can always call git blame, but
> a comment is easier to read.
> 
> Regards
> Stefan

Yea, ok. Send a patch.

One thing that I'm still converned about is what pci.c should do with
subsystem id, since setting it to redhat/qumranet by default is not
really the best thing to do: it clearly is unlikely to match any real
hardware, and the heuristic it uses to detect when to set subsystem id
is also kind of off: the spec ties it with class not with header type.

Maybe I'll just add a TODO for now :)

Patch hide | download patch | download mbox

diff --git a/hw/pcnet.c b/hw/pcnet.c
index 44b5b31..12260be 100644
--- a/hw/pcnet.c
+++ b/hw/pcnet.c
@@ -1997,6 +1997,9 @@  static int pci_pcnet_init(PCIDevice *pci_dev)
     pci_set_long(pci_conf + PCI_BASE_ADDRESS_0 + 4,
                  PCI_BASE_ADDRESS_SPACE_MEMORY);
 
+    pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, 0x0);
+    pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0);
+
     /* TODO: value must be 0 at RST# */
     pci_conf[PCI_INTERRUPT_PIN] = 1; // interrupt pin 0
     pci_conf[PCI_MIN_GNT] = 0x06;