return -1;
}
- switch (signature) {
- case 0xbad0cafe:
- return 0;
- case 0xbadacce5:
- return 1;
- }
-
+ switch (signature) {
+ case 0xbad0cafe: /* secure host mode device id */
+ return 0;
+ case 0xbadacce5: /* returned upon mapping the UAR bar */
+ case 0xffffffff: /* returned when pci mem access is disabled (driver down) */
+ return 1;
+ }
switch (signature & 0xffff) {
case 0x190 : /* 400 */
case 6100: /* 6100 */
case 0x245:
case 0x1ff:
+ return 0;
default:
fprintf(stderr, "-W- Unknown dev id: 0x%x\n", signature);
errno = ENOTTY;
int mtcr_mmap(mfile *mf, const char *name, off_t off, int ioctl_needed)
{
int err;
+ int rc;
mf->fd = open(name, O_RDWR | O_SYNC);
if (mf->fd < 0)
return -1;
}
- if (mtcr_check_signature(mf)) {
+ rc = mtcr_check_signature(mf);
+ if (rc) {
munmap(mf->ptr, MTCR_MAP_SIZE);
close(mf->fd);
errno = EIO;
- return -1;
+ return rc;
}
return 0;
char pbuf[] = "/proc/bus/pci/XX/XX.X";
char errbuf[4048]="";
int err;
+ int rc;
mf = (mfile *)malloc(sizeof(mfile));
if (!mf)
if (!mtcr_mmap(mf, name, 0, 0))
return mf;
}
-
goto open_failed;
}
sprintf(rbuf, "/sys/bus/pci/devices/%4.4x:%2.2x:%2.2x.%1.1x/resource0",
domain, bus, dev, func);
- if (!mtcr_mmap(mf, rbuf, 0, 0))
+ rc = mtcr_mmap(mf, rbuf, 0, 0);
+ if (rc == 0) {
return mf;
+ } else if (rc == 1) {
+ goto access_config;
+ }
/* Following access methods need the resource BAR */
offset = mtcr_sysfs_get_offset(domain, bus, dev, func);
sprintf(pdbuf, "/proc/bus/pci/%4.4x:%2.2x/%2.2x.%1.1x",
domain, bus, dev, func);
+ rc = mtcr_mmap(mf, pdbuf, offset, 1);
+ if (rc == 0) {
+ return mf;
+ } else if (rc == 1) {
+ goto access_config;
+ }
- if (!mtcr_mmap(mf, pdbuf, offset, 1))
+ rc = mtcr_mmap(mf, pdbuf, offset, 1);
+ if (rc == 0) {
return mf;
+ } else if (rc == 1) {
+ goto access_config;
+ }
if (!domain) {
sprintf(pbuf, "/proc/bus/pci/%2.2x/%2.2x.%1.1x",
bus, dev, func);
- if (!mtcr_mmap(mf, pbuf, offset, 1))
+ rc = mtcr_mmap(mf, pbuf, offset, 1);
+ if (rc == 0) {
return mf;
+ } else if (rc == 1) {
+ goto access_config;
+ }
}
#if CONFIG_USE_DEV_MEM
#if CONFIG_ENABLE_PCICONF && CONFIG_ENABLE_PCICONF
strerror_r(errno, errbuf, sizeof errbuf);
fprintf(stderr,
- "Warning: memory access to device %s failed: %s.\n"
- "Warning: Fallback on IO: much slower, and unsafe if device in use.\n",
- name, errbuf);
+ "Warning: memory access to device %s failed: %s. Switching to PCI config access.\n",
+ name, errbuf);
#endif
access_config_forced:
}
#endif
+#ifndef MTCR_EXPORT
static void mtcr_fix_endianness(u_int32_t *buf, int len) {
int i;
buf[i] = __be32_to_cpu(buf[i]);
}
}
-
+#endif
int mread_buffer(mfile *mf, unsigned int offset, u_int8_t* data, int byte_len)
#ifdef MTCR_EXPORT