|
@@ -148,7 +148,7 @@ int xen_pcibk_config_read(struct pci_dev *dev, int offset, int size,
|
|
struct xen_pcibk_dev_data *dev_data = pci_get_drvdata(dev);
|
|
struct xen_pcibk_dev_data *dev_data = pci_get_drvdata(dev);
|
|
const struct config_field_entry *cfg_entry;
|
|
const struct config_field_entry *cfg_entry;
|
|
const struct config_field *field;
|
|
const struct config_field *field;
|
|
- int req_start, req_end, field_start, field_end;
|
|
|
|
|
|
+ int field_start, field_end;
|
|
/* if read fails for any reason, return 0
|
|
/* if read fails for any reason, return 0
|
|
* (as if device didn't respond) */
|
|
* (as if device didn't respond) */
|
|
u32 value = 0, tmp_val;
|
|
u32 value = 0, tmp_val;
|
|
@@ -178,12 +178,10 @@ int xen_pcibk_config_read(struct pci_dev *dev, int offset, int size,
|
|
list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
|
|
list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
|
|
field = cfg_entry->field;
|
|
field = cfg_entry->field;
|
|
|
|
|
|
- req_start = offset;
|
|
|
|
- req_end = offset + size;
|
|
|
|
field_start = OFFSET(cfg_entry);
|
|
field_start = OFFSET(cfg_entry);
|
|
field_end = OFFSET(cfg_entry) + field->size;
|
|
field_end = OFFSET(cfg_entry) + field->size;
|
|
|
|
|
|
- if (req_end > field_start && field_end > req_start) {
|
|
|
|
|
|
+ if (offset + size > field_start && field_end > offset) {
|
|
err = conf_space_read(dev, cfg_entry, field_start,
|
|
err = conf_space_read(dev, cfg_entry, field_start,
|
|
&tmp_val);
|
|
&tmp_val);
|
|
if (err)
|
|
if (err)
|
|
@@ -191,7 +189,7 @@ int xen_pcibk_config_read(struct pci_dev *dev, int offset, int size,
|
|
|
|
|
|
value = merge_value(value, tmp_val,
|
|
value = merge_value(value, tmp_val,
|
|
get_mask(field->size),
|
|
get_mask(field->size),
|
|
- field_start - req_start);
|
|
|
|
|
|
+ field_start - offset);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -211,7 +209,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)
|
|
const struct config_field_entry *cfg_entry;
|
|
const struct config_field_entry *cfg_entry;
|
|
const struct config_field *field;
|
|
const struct config_field *field;
|
|
u32 tmp_val;
|
|
u32 tmp_val;
|
|
- int req_start, req_end, field_start, field_end;
|
|
|
|
|
|
+ int field_start, field_end;
|
|
|
|
|
|
if (unlikely(verbose_request))
|
|
if (unlikely(verbose_request))
|
|
printk(KERN_DEBUG
|
|
printk(KERN_DEBUG
|
|
@@ -224,19 +222,17 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)
|
|
list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
|
|
list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
|
|
field = cfg_entry->field;
|
|
field = cfg_entry->field;
|
|
|
|
|
|
- req_start = offset;
|
|
|
|
- req_end = offset + size;
|
|
|
|
field_start = OFFSET(cfg_entry);
|
|
field_start = OFFSET(cfg_entry);
|
|
field_end = OFFSET(cfg_entry) + field->size;
|
|
field_end = OFFSET(cfg_entry) + field->size;
|
|
|
|
|
|
- if (req_end > field_start && field_end > req_start) {
|
|
|
|
|
|
+ if (offset + size > field_start && field_end > offset) {
|
|
err = conf_space_read(dev, cfg_entry, field_start,
|
|
err = conf_space_read(dev, cfg_entry, field_start,
|
|
&tmp_val);
|
|
&tmp_val);
|
|
if (err)
|
|
if (err)
|
|
break;
|
|
break;
|
|
|
|
|
|
tmp_val = merge_value(tmp_val, value, get_mask(size),
|
|
tmp_val = merge_value(tmp_val, value, get_mask(size),
|
|
- req_start - field_start);
|
|
|
|
|
|
+ offset - field_start);
|
|
|
|
|
|
err = conf_space_write(dev, cfg_entry, field_start,
|
|
err = conf_space_write(dev, cfg_entry, field_start,
|
|
tmp_val);
|
|
tmp_val);
|