fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
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