Example #1
0
/*
** ATA Command/Register access dispatcher
*/
int dev_ata(ata_t *ata, io_insn_t *io)
{
   if(!io->in)
      ata->last_out = io->port;

   if(io->port == ATA_STATUS_REG(ata->base))
   {
      if(io->in)
	 return __dev_ata_status(ata, io);
      else
	 return dev_io_proxify_filter(io, __dev_ata_cmd_filter, ata);
   }

   if(io->port == ATA_ALT_STATUS_REG(ata->base))
   {
      if(io->in)
	 return __dev_ata_alt_status(ata, io);
      else
	 goto __proxify;
   }

   if(io->port == ATA_DEVICE_REG(ata->base))
      return __dev_ata_device(ata, io);

   if(io->port == ATA_DATA_REG(ata->base))
      return __dev_ata_data(ata, io);

   if(io->port == ATA_SECT_CNT_REG(ata->base))
      return dev_io_proxify_filter(io, __dev_ata_scnt_filter, ata);

   if(io->port == ATA_LBA_LOW_REG(ata->base) ||
      io->port == ATA_LBA_MID_REG(ata->base) ||
      io->port == ATA_LBA_HIGH_REG(ata->base))
      return dev_io_proxify_filter(io, __dev_ata_lba_filter, ata);

   if(io->port == ATA_ERR_REG(ata->base))
   {
      if(io->in)
	 debug(DEV_ATA, "ata err\n");
      else
	 debug(DEV_ATA, "ata feat\n");

      goto __proxify;
   }

   debug(DEV_ATA, "ata ???\n");

__proxify:
   return dev_io_proxify(io);
}
Example #2
0
int dev_sio(io_insn_t *io)
{
   switch(io->port)
   {
   case SIO_INDEX: info->vm.dev.sio_filter = __dev_sio_filter_index; break;
   case SIO_DATA: /* set by sio filter index */ break;
   default: info->vm.dev.sio_filter = NULL;
   }

   return dev_io_proxify_filter(io, info->vm.dev.sio_filter, NULL);
}
Example #3
0
int dev_pci(io_insn_t *io)
{
   switch(io->port)
   {
   case PCI_CONFIG_ADDR: info->vm.dev.pci_filter = __dev_pci_filter_addr; break;
   case PCI_CONFIG_DATA: /* set by pci filter addr */ break;
   default             : info->vm.dev.pci_filter = NULL;
   }

   return dev_io_proxify_filter(io, info->vm.dev.pci_filter, NULL);
}