cio
struct pci_conf_io *cio = NULL;
cio = malloc(sizeof(struct pci_conf_io), M_TEMP,
pci_conf_io_init(cio, data, cmd);
cio->num_matches = 0;
if ((cio->offset != 0)
&& (cio->generation != pci_generation)){
cio->status = PCI_GETCONF_LIST_CHANGED;
if (cio->offset >= pci_numdevs) {
cio->status = PCI_GETCONF_LAST_DEVICE;
iolen = min(cio->match_buf_len - (cio->match_buf_len % confsz),
if ((cio->num_patterns > 0) && (cio->num_patterns < pci_numdevs)
&& (cio->pat_buf_len > 0)) {
if (cio->num_patterns * pci_match_conf_size(cmd) !=
cio->pat_buf_len) {
cio->status = PCI_GETCONF_ERROR;
pattern_buf = malloc(cio->pat_buf_len, M_TEMP,
error = copyin(cio->patterns, pattern_buf,
cio->pat_buf_len);
num_patterns = cio->num_patterns;
} else if ((cio->num_patterns > 0)
|| (cio->pat_buf_len > 0)) {
cio->status = PCI_GETCONF_ERROR;
for (cio->num_matches = 0, i = 0,
if (i < cio->offset)
if (cio->num_matches >= ionum) {
(caddr_t)cio->matches +
confsz * cio->num_matches, confsz);
cio->num_matches++;
cio->offset = i;
cio->generation = pci_generation;
cio->status = PCI_GETCONF_LAST_DEVICE;
cio->status = PCI_GETCONF_MORE_DEVS;
pci_conf_io_update_data(cio, data, cmd);
free(cio, M_TEMP);
pci_conf_io_init(struct pci_conf_io *cio, caddr_t data, u_long cmd)
*cio = *(struct pci_conf_io *)data;
cio->pat_buf_len = cio32->pat_buf_len;
cio->num_patterns = cio32->num_patterns;
cio->patterns = (void *)(uintptr_t)cio32->patterns;
cio->match_buf_len = cio32->match_buf_len;
cio->num_matches = cio32->num_matches;
cio->matches = (void *)(uintptr_t)cio32->matches;
cio->offset = cio32->offset;
cio->generation = cio32->generation;
cio->status = cio32->status;
pci_conf_io_update_data(const struct pci_conf_io *cio, caddr_t data,
d_cio->status = cio->status;
d_cio->generation = cio->generation;
d_cio->offset = cio->offset;
d_cio->num_matches = cio->num_matches;
cio32->status = cio->status;
cio32->generation = cio->generation;
cio32->offset = cio->offset;
cio32->num_matches = cio->num_matches;
if (inb(cio) == 0x65) {
if (inb(cio) == 0x66) {
r = inb(cio) & SMC_CR1_ADDR;
inb(cio) & 0xff);
printf(" CR4=0x%x", inb(cio) & 0xff);
if ((inb(cio) & SMC_CR1_MODE) == 0) {
r = (inb(cio) & SMC_CR4_EMODE);
r = inb(cio);
outb(cio, r | SMC_CR1_MODE);
outb(cio, r & ~SMC_CR1_MODE);
r = inb(cio) & ~SMC_CR4_EMODE;
outb(cio, r | SMC_ECPEPP);
outb(cio, r | SMC_ECP);
outb(cio, r | SMC_EPPSPP);
outb(cio, 16);
r = inb(cio);
outb(cio, (r & ~SMC_CR4_EPPTYPE));
outb(cio, (r | SMC_CR4_EPPTYPE));