fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 141 lines 4.7 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/arch/macplus/scsi.h * 7 * Created: 2007-11-13 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2007-2014 Hampa Hug <hampa@hampa.ch> * 9 *****************************************************************************/ 10 11/***************************************************************************** 12 * This program is free software. You can redistribute it and / or modify it * 13 * under the terms of the GNU General Public License version 2 as published * 14 * by the Free Software Foundation. * 15 * * 16 * This program is distributed in the hope that it will be useful, but * 17 * WITHOUT ANY WARRANTY, without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * 19 * Public License for more details. * 20 *****************************************************************************/ 21 22 23#ifndef PCE_MACPLUS_SCSI_H 24#define PCE_MACPLUS_SCSI_H 1 25 26 27#include <limits.h> 28 29#include <drivers/block/block.h> 30 31#if PCE_ENABLE_VMNET 32#include <lib/vmnet.h> 33#endif 34 35enum { 36 MAC_SCSI_DEV_UNKNOWN, 37 MAC_SCSI_DEV_DISK, 38 MAC_SCSI_DEV_DAYNAPORT, 39}; 40 41typedef struct { 42 int valid; 43 44 int type; 45 46 /* the PCE drive number */ 47 unsigned drive; 48 49 unsigned char vendor[8]; 50 unsigned char product[16]; 51 unsigned char revision[4]; 52 53 int tap_enabled; 54 unsigned char mac_addr[6]; 55 char tap_dev[PATH_MAX]; 56 char tap_cmd[PATH_MAX]; 57 int tap_fd; 58#if PCE_ENABLE_VMNET 59 char bridged_if[20]; 60 struct pce_vmnet_interface *vmnet; 61#endif 62} mac_scsi_dev_t; 63 64 65typedef struct mac_scsi_s { 66 unsigned phase; 67 68 unsigned char odr; 69 unsigned char csd; 70 unsigned char icr; 71 unsigned char mr2; 72 unsigned char tcr; 73 unsigned char csb; 74 unsigned char ser; 75 unsigned char bsr; 76 77 unsigned char status; 78 unsigned char message; 79 80 unsigned cmd_i; 81 unsigned cmd_n; 82 unsigned char cmd[16]; 83 84 unsigned long buf_i; 85 unsigned long buf_n; 86 unsigned long buf_max; 87 unsigned char *buf; 88 89 unsigned sel_drv; 90 91 unsigned long addr_mask; 92 unsigned addr_shift; 93 94 void (*cmd_start) (struct mac_scsi_s *scsi); 95 void (*cmd_finish) (struct mac_scsi_s *scsi); 96 97 unsigned char set_int_val; 98 void *set_int_ext; 99 void (*set_int) (void *ext, unsigned char val); 100 101 mac_scsi_dev_t dev[8]; 102 103 disks_t *dsks; 104} mac_scsi_t; 105 106 107void mac_scsi_init (mac_scsi_t *scsi); 108void mac_scsi_free (mac_scsi_t *scsi); 109 110void mac_scsi_set_int_fct (mac_scsi_t *scsi, void *ext, void *fct); 111 112mac_scsi_dev_t *mac_scsi_get_device (mac_scsi_t *scsi); 113void mac_scsi_set_phase_status (mac_scsi_t *scsi, unsigned char val); 114void mac_scsi_set_phase_data_in (mac_scsi_t *scsi); 115void mac_scsi_set_phase_data_out (mac_scsi_t *scsi); 116void mac_scsi_cmd_write6_finish (mac_scsi_t *scsi); 117 118void mac_scsi_set_disks (mac_scsi_t *scsi, disks_t *dsks); 119void mac_scsi_set_drive (mac_scsi_t *scsi, unsigned id, unsigned drive); 120void mac_scsi_set_drive_vendor (mac_scsi_t *scsi, unsigned id, const char *vendor); 121void mac_scsi_set_drive_product (mac_scsi_t *scsi, unsigned id, const char *product); 122 123unsigned char mac_scsi_get_uint8 (void *ext, unsigned long addr); 124unsigned short mac_scsi_get_uint16 (void *ext, unsigned long addr); 125 126void mac_scsi_set_uint8 (void *ext, unsigned long addr, unsigned char val); 127void mac_scsi_set_uint16 (void *ext, unsigned long addr, unsigned short val); 128 129void mac_scsi_reset (mac_scsi_t *scsi); 130 131void mac_scsi_set_daynaport (mac_scsi_t *scsi, unsigned id, const char *tap_dev, const char *tap_cmd, const char *mac_addr, const char *bridged_if); 132int mac_scsi_daynaport_open (mac_scsi_t *scsi, mac_scsi_dev_t *dev); 133int mac_scsi_daynaport_data_avail (mac_scsi_dev_t *dev); 134size_t mac_scsi_daynaport_read (mac_scsi_dev_t *dev, unsigned char *buf); 135size_t mac_scsi_daynaport_write (mac_scsi_dev_t *dev, unsigned char *buf, size_t len); 136void mac_scsi_daynaport_cmd_read_stats (mac_scsi_t *scsi); 137void mac_scsi_daynaport_cmd_set_interface_mode (mac_scsi_t *scsi); 138void mac_scsi_daynaport_cmd_set_mcast_addr (mac_scsi_t *scsi); 139void mac_scsi_daynaport_cmd_enable_interface (mac_scsi_t *scsi); 140 141#endif