Oops, forgot another.
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Mon, 13 Apr 2009 04:20:45 +0000 (21:20 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Mon, 13 Apr 2009 04:39:04 +0000 (21:39 -0700)
src/include/gpxe/fwtrans.h [new file with mode: 0644]

diff --git a/src/include/gpxe/fwtrans.h b/src/include/gpxe/fwtrans.h
new file mode 100644 (file)
index 0000000..c606a0c
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 Joshua Oreman <oremanj@rwcr.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _GPXE_FWTRANS_H
+#define _GPXE_FWTRANS_H
+
+/*
+ * Connection process:
+ * - gPXE allocates a buffer, puts its address in buffer and physaddr
+ *   in buffer_paddr, size in buffer_size, filename in buffer,
+ *   filename length | FWTRANS_SYN in request, and FWTRANS_MAGIC in
+ *   magic.
+ * - host sees that, writes file size | FWTRANS_ACK to response, starts
+ *   writing to buffer and moving idx_put. When everything's written
+ *   removes FWTRANS_ACK and OR's FWTRANS_FIN into response.
+ * - gPXE removes FWTRANS_SYN, moves idx_get as bytes are written; once
+ *   everything's read OR's FWTRANS_FIN into request.
+ * - If there's an error, FWTRANS_NAK instead. No error recovery is
+ *   implemented; once you write a NAK the connection is abandoned.
+ * - Once the host sees gPXE's FWTRANS_FIN in request, it OR's FWTRANS_ACK
+ *   into response. gPXE sees that and resets everything.
+ *
+ * In brief:
+ * request   response
+ * 0         wait
+ * SYN       read filename, open, write size
+ * wait      ACK/NAK
+ * ~SYN      wait
+ * read      ~ACK, write
+ * read      FIN/NAK
+ * FIN/NAK   wait
+ * reset     0
+ */
+#define FWTRANS_SYN    0x10000000
+#define FWTRANS_ACK    0x20000000
+#define FWTRANS_NAK    0x40000000
+#define FWTRANS_FIN    0x80000000
+#define FWTRANS_DATAMASK       0x0fffffff
+#define FWTRANS_SIZE(x)        ((x) & FWTRANS_DATAMASK)
+struct fwtrans_connection 
+{
+       u32 buffer_size;
+       u32 request;
+       volatile u32 response;
+#ifndef USERSPACE
+       u8 *buffer;
+#else
+       u32 buffer_vaddr;
+#endif
+       u32 buffer_addr;
+       u32 idx_get;
+       volatile u32 idx_put;
+#define FWTRANS_MAGIC 0x34393331       /* '1394' */
+       u32 magic;
+};
+
+#endif