* pciback_field_is_dup needs a fix
@ 2007-03-08 19:39 Jambunathan K
2007-03-08 19:43 ` Jambunathan K
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Jambunathan K @ 2007-03-08 19:39 UTC (permalink / raw)
To: xen-devel; +Cc: sanjeev
Shouldn't pciback_field_is_dup(dev, field->offset) be scoped to include
the base_offset as well?
Currently with xen-3.0.4 the issue is this:
Adding of PCI_PM_CTRL (at offset 4) to the 'config_fields list' gets
skipped because it ends up being a duplicate of PCI_COMMAND (at offset 4
as well). As a result when a PCI device behind a PCI frontend does a
power up using pci_enable_device() the following message gets flashed on
the console.
pciback 0000:0b:00.3: Driver tried to write to a read-only configuration
space field at offset 0x84, size 2. This may be harmless, but if you
have problems with your device:
1) see permissive attribute in sysfs
2) report problems to the xen-devel mailing list along with details of
your device obtained from lspci.
Thanks,
Jambunathan K.
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: pciback_field_is_dup needs a fix 2007-03-08 19:39 pciback_field_is_dup needs a fix Jambunathan K @ 2007-03-08 19:43 ` Jambunathan K 2007-03-08 20:43 ` Chris 2007-03-09 9:18 ` Keir Fraser 2 siblings, 0 replies; 5+ messages in thread From: Jambunathan K @ 2007-03-08 19:43 UTC (permalink / raw) To: Jambunathan K; +Cc: xen-devel, sanjeev Here is quick log from frontend debug showing this happening: pciback 0000:0b:00.3: added config field at offset 0x04 pciback 0000:0b:00.3: added config field at offset 0x3c pciback 0000:0b:00.3: added config field at offset 0x3d pciback 0000:0b:00.3: added config field at offset 0x0c pciback 0000:0b:00.3: added config field at offset 0x0d pciback 0000:0b:00.3: added config field at offset 0x0f pciback 0000:0b:00.3: added config field at offset 0x10 pciback 0000:0b:00.3: added config field at offset 0x14 pciback 0000:0b:00.3: added config field at offset 0x18 pciback 0000:0b:00.3: added config field at offset 0x1c pciback 0000:0b:00.3: added config field at offset 0x20 pciback 0000:0b:00.3: added config field at offset 0x24 pciback 0000:0b:00.3: added config field at offset 0x30 pciback 0000:0b:00.3: Found capability 0x1 at 0x80 pciback 0000:0b:00.3: added config field at offset 0x80 pciback 0000:0b:00.3: added config field at offset 0x82 <------ 0x80 + 4 missing here pciback 0000:0b:00.3: added config field at offset 0x86 pciback 0000:0b:00.3: added config field at offset 0x87 Thanks, Jambunathan K. Jambunathan K wrote: > Shouldn't pciback_field_is_dup(dev, field->offset) be scoped to > include the base_offset as well? > > Currently with xen-3.0.4 the issue is this: > > Adding of PCI_PM_CTRL (at offset 4) to the 'config_fields list' gets > skipped because it ends up being a duplicate of PCI_COMMAND (at offset > 4 as well). As a result when a PCI device behind a PCI frontend does > a power up using pci_enable_device() the following message gets > flashed on the console. > > pciback 0000:0b:00.3: Driver tried to write to a read-only > configuration space field at offset 0x84, size 2. This may be > harmless, but if you have problems with your device: > 1) see permissive attribute in sysfs > 2) report problems to the xen-devel mailing list along with details of > your device obtained from lspci. > > Thanks, > Jambunathan K. > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: pciback_field_is_dup needs a fix 2007-03-08 19:39 pciback_field_is_dup needs a fix Jambunathan K 2007-03-08 19:43 ` Jambunathan K @ 2007-03-08 20:43 ` Chris 2007-03-09 9:18 ` Keir Fraser 2 siblings, 0 replies; 5+ messages in thread From: Chris @ 2007-03-08 20:43 UTC (permalink / raw) To: Jambunathan K; +Cc: xen-devel, sanjeev Jambunathan K wrote: > Shouldn't pciback_field_is_dup(dev, field->offset) be scoped to include > the base_offset as well? I think you're right. Let me see what needs to be changed to accomplish the intended behavior. Thanks, Chris ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: pciback_field_is_dup needs a fix 2007-03-08 19:39 pciback_field_is_dup needs a fix Jambunathan K 2007-03-08 19:43 ` Jambunathan K 2007-03-08 20:43 ` Chris @ 2007-03-09 9:18 ` Keir Fraser 2007-03-09 21:26 ` [PATCH] [pciback] " Chris 2 siblings, 1 reply; 5+ messages in thread From: Keir Fraser @ 2007-03-09 9:18 UTC (permalink / raw) To: Jambunathan K, xen-devel; +Cc: sanjeev On 8/3/07 19:39, "Jambunathan K" <jambunathan@netxen.com> wrote: > Shouldn't pciback_field_is_dup(dev, field->offset) be scoped to include > the base_offset as well? Absolutely. Thanks for tracking it down! -- Keir ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] [pciback] Re: pciback_field_is_dup needs a fix 2007-03-09 9:18 ` Keir Fraser @ 2007-03-09 21:26 ` Chris 0 siblings, 0 replies; 5+ messages in thread From: Chris @ 2007-03-09 21:26 UTC (permalink / raw) To: Keir Fraser; +Cc: Jambunathan K, xen-devel [-- Attachment #1: Type: text/plain, Size: 483 bytes --] This is a follow-up to pciback changes made earlier today that add several fixes: - remove superfluous call to pciback_field_is_dup() - fix a variable type mismatch in pciback_field_is_dup() - make readability improvements by using the OFFSET macro - revises quirk data output via the sysfs quirks node so that displayed offset information includes base_offset. Thanks to Jambunathan K. for giving such specific bug diagnosis. Signed-off-by: Chris Bookholt <hap10@tycho.ncsc.mil> [-- Attachment #2: pciback.patch --] [-- Type: text/plain, Size: 3525 bytes --] diff -r 6ff2a1286484 linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c --- a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c Fri Mar 09 16:04:19 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c Fri Mar 09 16:07:38 2007 -0500 @@ -349,16 +349,12 @@ void pciback_config_free_dev(struct pci_ int pciback_config_add_field_offset(struct pci_dev *dev, struct config_field *field, - unsigned int offset) + unsigned int base_offset) { int err = 0; struct pciback_dev_data *dev_data = pci_get_drvdata(dev); struct config_field_entry *cfg_entry; void *tmp; - - /* silently ignore duplicate fields */ - if (pciback_field_is_dup(dev, field->offset + offset)) - goto out; cfg_entry = kmalloc(sizeof(*cfg_entry), GFP_KERNEL); if (!cfg_entry) { @@ -368,7 +364,12 @@ int pciback_config_add_field_offset(stru cfg_entry->data = NULL; cfg_entry->field = field; - cfg_entry->base_offset = offset; + cfg_entry->base_offset = base_offset; + + /* silently ignore duplicate fields */ + err = pciback_field_is_dup(dev,OFFSET(cfg_entry)); + if (err) + goto out; if (field->init) { tmp = field->init(dev, OFFSET(cfg_entry)); diff -r 6ff2a1286484 linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c --- a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c Fri Mar 09 16:04:19 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c Fri Mar 09 16:07:38 2007 -0500 @@ -32,16 +32,14 @@ static inline void register_quirk(struct list_add_tail(&quirk->quirks_list, &pciback_quirks); } -int pciback_field_is_dup(struct pci_dev *dev, int reg) +int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg) { int ret = 0; struct pciback_dev_data *dev_data = pci_get_drvdata(dev); - struct config_field *field; struct config_field_entry *cfg_entry; list_for_each_entry(cfg_entry, &dev_data->config_fields, list) { - field = cfg_entry->field; - if (field->offset == reg) { + if ( OFFSET(cfg_entry) == reg) { ret = 1; break; } diff -r 6ff2a1286484 linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h --- a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h Fri Mar 09 16:04:19 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h Fri Mar 09 16:07:38 2007 -0500 @@ -30,6 +30,6 @@ void pciback_config_field_free(struct co int pciback_config_quirk_release(struct pci_dev *dev); -int pciback_field_is_dup(struct pci_dev *dev, int reg); +int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg); #endif diff -r 6ff2a1286484 linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c --- a/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c Fri Mar 09 16:04:19 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c Fri Mar 09 16:07:38 2007 -0500 @@ -589,10 +589,6 @@ static int pcistub_reg_add(int domain, i } dev = psdev->dev; - /* check for duplicate field */ - if (pciback_field_is_dup(dev, reg)) - goto out; - field = kzalloc(sizeof(*field), GFP_ATOMIC); if (!field) { err = -ENOMEM; @@ -728,10 +724,10 @@ static ssize_t pcistub_quirk_show(struct if (count >= PAGE_SIZE) goto out; - count += scnprintf(buf + count, PAGE_SIZE - - count, "\t\t%08x:%01x:%08x\n", - field->offset, field->size, - field->mask); + count += scnprintf(buf + count, PAGE_SIZE - count, + "\t\t%08x:%01x:%08x\n", + cfg_entry->base_offset + field->offset, + field->size, field->mask); } } [-- Attachment #3: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-03-09 21:26 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-03-08 19:39 pciback_field_is_dup needs a fix Jambunathan K 2007-03-08 19:43 ` Jambunathan K 2007-03-08 20:43 ` Chris 2007-03-09 9:18 ` Keir Fraser 2007-03-09 21:26 ` [PATCH] [pciback] " Chris
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.