static int mcf_pci_readconfig(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) { unsigned long addr; *value = 0xffffffff; if (bus->number == 0) { if (mcf_host_slot2sid[PCI_SLOT(devfn)] == 0) return PCIBIOS_SUCCESSFUL; } syncio(); addr = mcf_mk_pcicar(bus->number, devfn, where); __raw_writel(PCICAR_E | addr, PCICAR); addr = iospace + (where & 0x3); switch (size) { case 1: *value = __raw_readb(addr); break; case 2: *value = le16_to_cpu(__raw_readw(addr)); break; default: *value = le32_to_cpu(__raw_readl(addr)); break; } syncio(); __raw_writel(0, PCICAR); return PCIBIOS_SUCCESSFUL; }
static int mcf_pci_writeconfig(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) { unsigned long addr; if (bus->number == 0) { if (mcf_host_slot2sid[PCI_SLOT(devfn)] == 0) return PCIBIOS_SUCCESSFUL; } syncio(); addr = mcf_mk_pcicar(bus->number, devfn, where); __raw_writel(PCICAR_E | addr, PCICAR); addr = iospace + (where & 0x3); switch (size) { case 1: __raw_writeb(value, addr); break; case 2: __raw_writew(cpu_to_le16(value), addr); break; default: __raw_writel(cpu_to_le32(value), addr); break; } syncio(); __raw_writel(0, PCICAR); return PCIBIOS_SUCCESSFUL; }
int blockio(int rw, struct sb *sb, struct buffer_head *buffer, block_t block) { struct bio_vec vec = { .bv_page = buffer->b_page, .bv_offset = bh_offset(buffer), .bv_len = sb->blocksize, }; return syncio(rw, sb_dev(sb), block << sb->blockbits, 1, &vec); } /* * bufvec based I/O. This takes the bufvec has contiguous range, and * will submit the count of buffers to block (physical address). * * If there was I/O error, it would be handled in ->bi_end_bio() * completion. */ int blockio_vec(int rw, struct bufvec *bufvec, block_t block, unsigned count) { return bufvec_io(rw, bufvec, block, count); } void hexdump(void *data, unsigned size) { print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 16, 1, data, size, 1); }