forcing device into host mode requires a full config - which we will do in opendevice...
[AROS.git] / rom / partition / openrootpartition.c
blob1e0a42f94a3846fcdf610e64aa99bba814a92dfe
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 */
7 #include <proto/exec.h>
8 #include <exec/memory.h>
10 #include "partition_intern.h"
11 #include "partition_support.h"
12 #include "platform.h"
14 /*****************************************************************************
16 NAME */
17 AROS_LH2(struct PartitionHandle *, OpenRootPartition,
19 /* SYNOPSIS */
20 AROS_LHA(CONST_STRPTR, Device, A1),
21 AROS_LHA(LONG, Unit, D1),
23 /* LOCATION */
24 struct Library *, PartitionBase, 5, Partition)
26 /* FUNCTION
27 Create a root handle by opening a trackdisk-compatible device.
29 INPUTS
30 Device - name of the block device
31 Unit - unit of the block device
33 RESULT
34 handle to the device
36 NOTES
38 EXAMPLE
40 BUGS
42 SEE ALSO
44 INTERNALS
46 HISTORY
47 21-02-02 first version
49 *****************************************************************************/
51 AROS_LIBFUNC_INIT
53 struct PartitionHandle *ph;
55 if (Device == NULL)
56 return NULL;
58 ph = AllocMem(sizeof(struct PartitionHandle), MEMF_PUBLIC | MEMF_CLEAR);
59 if (ph)
61 ph->bd = AllocMem(sizeof(struct PartitionBlockDevice), MEMF_PUBLIC);
62 if (ph->bd)
64 ph->bd->cmdread = CMD_READ;
65 ph->bd->cmdwrite = CMD_WRITE;
66 ph->bd->port = CreateMsgPort();
67 if (ph->bd->port)
69 ph->bd->ioreq = (struct IOExtTD *)CreateIORequest(ph->bd->port, sizeof(struct IOExtTD));
70 if (ph->bd->ioreq)
72 if (OpenDevice(Device, Unit, (struct IORequest *)ph->bd->ioreq, 0)==0)
74 if (getGeometry(PartitionBase, ph->bd->ioreq, &ph->dg)==0)
76 if (ph->dg.dg_DeviceType != DG_CDROM)
78 ph->de.de_SizeBlock = ph->dg.dg_SectorSize>>2;
79 ph->de.de_Surfaces = ph->dg.dg_Heads;
80 ph->de.de_BlocksPerTrack = ph->dg.dg_TrackSectors;
81 ph->de.de_HighCyl = ph->dg.dg_Cylinders-1;
82 ph->de.de_BufMemType = ph->dg.dg_BufMemType;
84 /* The following are common defaults */
85 ph->de.de_TableSize = DE_BUFMEMTYPE;
86 ph->de.de_SectorPerBlock = 1;
87 ph->de.de_NumBuffers = 20;
89 PartitionNsdCheck(PartitionBase, ph);
90 return ph;
93 CloseDevice((struct IORequest *)ph->bd->ioreq);
95 DeleteIORequest((struct IORequest *)ph->bd->ioreq);
97 DeleteMsgPort(ph->bd->port);
99 FreeMem(ph->bd, sizeof(struct PartitionBlockDevice));
101 FreeMem(ph, sizeof(struct PartitionHandle));
102 ph = 0;
104 return 0;
105 AROS_LIBFUNC_EXIT