annotate packages/io/disk/current/src/disk.c @ 2300:654c837cc618

* include/disk.h (DISK_CHANNEL): No need for extra _part_dev slot intended for entire disk's own devtab. * src/disk.c (disk_lookup): Just access pdevs_dev directly with no adjusted offset. (disk_init): No longer set entry 0 from device devtab. It's unnecessary. * include/disk.h: Merge eCosCentric CVS with public eCos CVS. This merges (and therefore changes) the API. ChangeLog entries have been incorporated in the correct places below. * include/diskio.h: Also merged. * cdl/io_disk.cdl: Also merged. * src/disk.c: Also merged. * src/disk.c (read_partition): Switched to favour LBA partition information in partition tables. This also means we don't now rely on the driver reporting a correct CHS size for the disk. (disk_bread, disk_bwrite): API changed to take length in sectors rather than bytes. Also call hardware driver to transfer in (up to) max_transfer sized chunks, rather than a sector at a time. Call in to driver now made with DSR lock claimed, to avoid a race condition between the DSR and the calling thread. (disk_get_config): Added phys_block_size to channel info. * include/diskio.h (struct cyg_disk_identify_t): Added phys_block_size and max_transfer fields. These must be filled in by the driver. * include/disk.h (DISK_CHANNEL_INIT): New macro. Allows a DISK_CHANNEL to be defined dynamically. * src/disk.c (disk_bread, disk_bwrite): Made calls to cyg_thread_yield() dependent on presence ok kernel. * src/disk.c (disk_bwrite): Uncomment the cyg_thread_yield() at the end to prevent thread starvation between threads at the same priority. (disk_bread): Ditto. * src/disk.c (read_partition): Changed to account for very large disks which report bogus CHS geometry. We can only use the LBA partition parameters in such disks. (disk_set_config): Added some extra debug output. * src/disk.c: Various changes to support disconnect/reconnect of changeable media. * include/diskio.h: Added mount counter to disk_info structure. * include/disk.h: Changed disk_disconnected() function to take a pointer to a struct disk_channel rather than a struct cyg_devtab_entry. Added mount count to disk_channel structure. Moved include of diskio.h to end to fix declaration problems. * src/disk.c: Fixed bug in write routine where controller result field was not being initialized. Added signals on controller queue condition variable after setting controller busy flag to false. * include/disk.h: Made controller result and busy fields volatile. Just in case. * include/disk.h: * src/disk.c: Many changes. Added additional disk_controller data structure to better reflect hardware structure. Added support for serialization of multithreaded accesses to a single controller. Added support for asynchronous, interrupt driven, IO operations. Various tidies.
author jlarmour
date Thu, 21 Sep 2006 16:38:38 +0000
parents 16ea61a1d5d4
children 21a641579915
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
1 //==========================================================================
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
2 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
3 // io/disk/disk.c
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
4 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
5 // High level disk driver
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
6 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
7 //==========================================================================
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
9 // -------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
11 // Copyright (C) 2003 Savin Zlobec
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
12 // Copyright (C) 2004, 2005, 2006 eCosCentric Limited
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
13 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
17 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
21 // for more details.
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
22 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
23 // You should have received a copy of the GNU General Public License along
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
26 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
28 // or inline functions from this file, or you compile this file and link it
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
29 // with other works to produce a work based on this file, this file does not
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
31 // License. However the source code for this file must still be made available
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
33 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
35 // this file might be covered by the GNU General Public License.
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
36 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
37 // -------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
38 //####ECOSGPLCOPYRIGHTEND####
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
39 //==========================================================================
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
41 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
42 // Author(s): savin
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
43 // Date: 2003-06-10
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
44 // Purpose: Top level disk driver
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
45 // Description:
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
46 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
47 //####DESCRIPTIONEND####
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
48 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
49 //==========================================================================
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
50
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
51 #include <pkgconf/io.h>
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
52 #include <pkgconf/io_disk.h>
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
53
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
54 #include <cyg/io/io.h>
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
55 #include <cyg/io/devtab.h>
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
56 #include <cyg/io/disk.h>
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
57 #include <cyg/infra/cyg_ass.h> // assertion support
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
58 #include <cyg/infra/diag.h> // diagnostic output
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
59
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
60 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
61
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
62 #ifdef CYGDBG_IO_DISK_DEBUG
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
63 #define DEBUG 1
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
64 #endif
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
65
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
66 #ifdef DEBUG
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
67 # define D(_args_) diag_printf _args_
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
68 #else
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
69 # define D(_args_)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
70 #endif
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
71
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
72 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
73
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
74 // Master Boot Record defines
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
75 #define MBR_SIG_ADDR 0x1FE // signature address
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
76 #define MBR_SIG_BYTE0 0x55 // signature first byte value
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
77 #define MBR_SIG_BYTE1 0xAA // signature second byte value
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
78 #define MBR_PART_ADDR 0x1BE // first partition address
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
79 #define MBR_PART_SIZE 0x10 // partition size
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
80 #define MBR_PART_NUM 4 // number of partitions
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
81
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
82 // Get cylinders, heads and sectors from data (MBR partition format)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
83 #define READ_CHS(_data_, _c_, _h_, _s_) \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
84 do { \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
85 _h_ = (*((cyg_uint8 *)_data_)); \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
86 _s_ = (*(((cyg_uint8 *)_data_)+1) & 0x3F); \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
87 _c_ = (*(((cyg_uint8 *)_data_)+1) & ~0x3F) << 2 | \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
88 (*(((cyg_uint8 *)_data_)+2)); \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
89 } while (0)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
90
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
91 // Get double word from data (MBR partition format)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
92 #define READ_DWORD(_data_, _val_) \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
93 do { \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
94 _val_ = *((cyg_uint8 *)_data_) | \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
95 *(((cyg_uint8 *)_data_)+1) << 8 | \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
96 *(((cyg_uint8 *)_data_)+2) << 16 | \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
97 *(((cyg_uint8 *)_data_)+3) << 24; \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
98 } while (0)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
99
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
100 // Convert cylinders, heads and sectors to LBA sectors
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
101 #define CHS_TO_LBA(_info_, _c_, _h_, _s_, _lba_) \
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
102 (_lba_=(((_c_)*(_info_)->heads_num+(_h_))*(_info_)->sectors_num)+(_s_)-1)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
103
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
104 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
105
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
106 static Cyg_ErrNo disk_bread(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
107 void *buf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
108 cyg_uint32 *len,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
109 cyg_uint32 pos);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
110
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
111 static Cyg_ErrNo disk_bwrite(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
112 const void *buf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
113 cyg_uint32 *len,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
114 cyg_uint32 pos);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
115
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
116 static Cyg_ErrNo disk_select(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
117 cyg_uint32 which,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
118 CYG_ADDRWORD info);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
119
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
120 static Cyg_ErrNo disk_get_config(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
121 cyg_uint32 key,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
122 void *buf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
123 cyg_uint32 *len);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
124
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
125 static Cyg_ErrNo disk_set_config(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
126 cyg_uint32 key,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
127 const void *buf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
128 cyg_uint32 *len);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
129
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
130 BLOCK_DEVIO_TABLE(cyg_io_disk_devio,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
131 disk_bwrite,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
132 disk_bread,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
133 disk_select,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
134 disk_get_config,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
135 disk_set_config
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
136 );
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
137
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
138 static cyg_bool disk_init(struct cyg_devtab_entry *tab);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
139
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
140 static Cyg_ErrNo disk_connected(struct cyg_devtab_entry *tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
141 cyg_disk_identify_t *ident);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
142
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
143 static Cyg_ErrNo disk_disconnected(struct disk_channel *chan);
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
144
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
145 static Cyg_ErrNo disk_lookup(struct cyg_devtab_entry **tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
146 struct cyg_devtab_entry *sub_tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
147 const char *name);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
148
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
149 static void disk_transfer_done(struct disk_channel *chan, Cyg_ErrNo res);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
150
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
151 DISK_CALLBACKS(cyg_io_disk_callbacks,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
152 disk_init,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
153 disk_connected,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
154 disk_disconnected,
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
155 disk_lookup,
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
156 disk_transfer_done
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
157 );
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
158
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
159 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
160 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
161 // Read partition from data
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
162 //
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
163
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
164 static void
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
165 read_partition(cyg_uint8 *data,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
166 cyg_disk_info_t *info,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
167 cyg_disk_partition_t *part)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
168 {
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
169 cyg_disk_identify_t *ident = &info->ident;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
170 cyg_uint16 c, h, s;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
171 cyg_uint32 start, end, size;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
172
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
173 #ifdef DEBUG
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
174 diag_printf("Partition data:\n");
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
175 diag_dump_buf( data, 16 );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
176 diag_printf("Disk geometry: %d/%d/%d\n",info->ident.cylinders_num,
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
177 info->ident.heads_num, info->ident.sectors_num );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
178 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
179
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
180 // Retrieve basic information
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
181 part->type = data[4];
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
182 part->state = data[0];
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
183 READ_DWORD(&data[12], part->size);
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
184
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
185 READ_DWORD(&data[8], start);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
186 READ_DWORD(&data[12], size);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
187
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
188 // Use the LBA start and size fields if they are valid. Otherwise
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
189 // fall back to CHS.
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
190
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
191 if( start > 0 && size > 0 )
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
192 {
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
193 READ_DWORD(&data[8], start);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
194 end = start + size - 1;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
195
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
196 #ifdef DEBUG
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
197 diag_printf("Using LBA partition parameters\n");
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
198 diag_printf(" LBA start %d\n",start);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
199 diag_printf(" LBA size %d\n",size);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
200 diag_printf(" LBA end %d\n",end);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
201 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
202
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
203 }
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
204 else
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
205 {
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
206 READ_CHS(&data[1], c, h, s);
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
207 CHS_TO_LBA(ident, c, h, s, start);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
208 #ifdef DEBUG
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
209 diag_printf("Using CHS partition parameters\n");
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
210 diag_printf(" CHS start %d/%d/%d => %d\n",c,h,s,start);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
211 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
212
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
213 READ_CHS(&data[5], c, h, s);
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
214 CHS_TO_LBA(ident, c, h, s, end);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
215 #ifdef DEBUG
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
216 diag_printf(" CHS end %d/%d/%d => %d\n",c,h,s,end);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
217 diag_printf(" CHS size %d\n",size);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
218 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
219
2274
16ea61a1d5d4 * cdl/io_disk.cdl: Made debugging CDL controlled.
asl
parents: 2111
diff changeset
220 }
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
221
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
222 part->size = size;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
223 part->start = start;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
224 part->end = end;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
225 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
226
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
227 // ---------------------------------------------------------------------------
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
228 //
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
229 // Read Master Boot Record (partitions)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
230 //
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
231
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
232 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
233 read_mbr(disk_channel *chan)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
234 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
235 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
236 disk_funs *funs = chan->funs;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
237 disk_controller *ctlr = chan->controller;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
238 cyg_uint8 buf[512];
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
239 Cyg_ErrNo res = ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
240 int i;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
241
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
242 D(("read MBR\n"));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
243
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
244 for (i = 0; i < info->partitions_num; i++)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
245 info->partitions[i].type = 0x00;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
246
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
247
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
248
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
249 cyg_drv_mutex_lock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
250
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
251 while( ctlr->busy )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
252 cyg_drv_cond_wait( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
253
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
254 ctlr->busy = true;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
255
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
256 ctlr->result = -EWOULDBLOCK;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
257
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
258 for( i = 0; i < sizeof(buf); i++ )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
259 buf[i] = 0;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
260
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
261 res = (funs->read)(chan, (void *)buf, 1, 0);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
262
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
263 if( res == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
264 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
265 // If the driver replys EWOULDBLOCK, then the transfer is
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
266 // being handled asynchronously and when it is finished it
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
267 // will call disk_transfer_done(). This will wake us up here
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
268 // to continue.
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
269
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
270 while( ctlr->result == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
271 cyg_drv_cond_wait( &ctlr->async );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
272
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
273 res = ctlr->result;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
274 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
275
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
276 ctlr->busy = false;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
277
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
278 cyg_drv_mutex_unlock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
279
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
280 if (ENOERR != res)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
281 return res;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
282
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
283 #ifdef DEBUG
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
284 diag_dump_buf_with_offset( buf, 512, buf );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
285 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
286
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
287 if (MBR_SIG_BYTE0 == buf[MBR_SIG_ADDR+0] && MBR_SIG_BYTE1 == buf[MBR_SIG_ADDR+1])
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
288 {
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
289 int npart;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
290
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
291 D(("disk MBR found\n"));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
292
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
293 npart = info->partitions_num < MBR_PART_NUM ?
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
294 info->partitions_num : MBR_PART_NUM;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
295
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
296 for (i = 0; i < npart; i++)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
297 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
298 cyg_disk_partition_t *part = &info->partitions[i];
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
299
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
300 read_partition(&buf[MBR_PART_ADDR+MBR_PART_SIZE*i], info, part);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
301 #ifdef DEBUG
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
302 if (0x00 != part->type)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
303 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
304 D(("\ndisk MBR partition %d:\n", i));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
305 D((" type = %02X\n", part->type));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
306 D((" state = %02X\n", part->state));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
307 D((" start = %d\n", part->start));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
308 D((" end = %d\n", part->end));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
309 D((" size = %d\n\n", part->size));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
310 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
311 #endif
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
312 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
313 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
314 return ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
315 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
316
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
317 // ---------------------------------------------------------------------------
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
318
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
319 static cyg_bool
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
320 disk_init(struct cyg_devtab_entry *tab)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
321 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
322 disk_channel *chan = (disk_channel *) tab->priv;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
323 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
324 int i;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
325
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
326 if (!chan->init)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
327 {
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
328 disk_controller *controller = chan->controller;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
329
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
330 if( !controller->init )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
331 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
332 cyg_drv_mutex_init( &controller->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
333 cyg_drv_cond_init( &controller->queue, &controller->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
334 cyg_drv_cond_init( &controller->async, &controller->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
335
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
336 controller->init = true;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
337 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
338
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
339 info->connected = false;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
340
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
341 // clear partition data
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
342 for (i = 0; i < info->partitions_num; i++)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
343 info->partitions[i].type = 0x00;
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
344
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
345 chan->init = true;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
346 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
347 return true;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
348 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
349
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
350 // ---------------------------------------------------------------------------
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
351
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
352 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
353 disk_connected(struct cyg_devtab_entry *tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
354 cyg_disk_identify_t *ident)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
355 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
356 disk_channel *chan = (disk_channel *) tab->priv;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
357 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
358 Cyg_ErrNo res = ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
359
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
360 if (!chan->init)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
361 return -EINVAL;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
362
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
363 // If the device is already connected, nothing more to do
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
364 if( info->connected )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
365 return ENOERR;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
366
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
367 // If any of these assertions fire, it is probable that the
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
368 // hardware driver has not been updated to match the current disk
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
369 // API.
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
370 CYG_ASSERT( ident->lba_sectors_num > 0, "Bad LBA sector count" );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
371 CYG_ASSERT( ident->phys_block_size > 0, "Bad physical block size");
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
372 CYG_ASSERT( ident->max_transfer > 0, "Bad max transfer size");
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
373
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
374 info->ident = *ident;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
375 info->block_size = 512;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
376 info->blocks_num = ident->lba_sectors_num;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
377 info->phys_block_size = ident->phys_block_size;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
378
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
379 D(("disk connected\n"));
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
380 D((" serial = '%s'\n", ident->serial));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
381 D((" firmware rev = '%s'\n", ident->firmware_rev));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
382 D((" model num = '%s'\n", ident->model_num));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
383 D((" block_size = %d\n", info->block_size));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
384 D((" blocks_num = %u\n", info->blocks_num));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
385 D((" phys_block_size = %d\n", info->phys_block_size));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
386
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
387 if (chan->mbr_support)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
388 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
389 // read disk master boot record
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
390 res = read_mbr(chan);
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
391 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
392
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
393 if (ENOERR == res)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
394 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
395 // now declare that we are connected
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
396 info->connected = true;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
397 chan->valid = true;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
398 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
399 return res;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
400 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
401
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
402 // ---------------------------------------------------------------------------
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
403
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
404 static Cyg_ErrNo
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
405 disk_disconnected(disk_channel *chan)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
406 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
407 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
408 int i;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
409
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
410 if (!chan->init)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
411 return -EINVAL;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
412
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
413 info->connected = false;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
414 chan->valid = false;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
415
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
416 // clear partition data and invalidate partition devices
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
417 for (i = 0; i < info->partitions_num; i++)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
418 {
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
419 info->partitions[i].type = 0x00;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
420 chan->pdevs_chan[i].valid = false;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
421 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
422
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
423
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
424 D(("disk disconnected\n"));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
425
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
426 return ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
427 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
428
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
429 // ---------------------------------------------------------------------------
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
430
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
431 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
432 disk_lookup(struct cyg_devtab_entry **tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
433 struct cyg_devtab_entry *sub_tab,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
434 const char *name)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
435 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
436 disk_channel *chan = (disk_channel *) (*tab)->priv;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
437 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
438 struct cyg_devtab_entry *new_tab;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
439 disk_channel *new_chan;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
440 int dev_num;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
441
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
442 if (!info->connected)
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
443 return -EINVAL;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
444
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
445 dev_num = 0;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
446
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
447 while ('\0' != *name)
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
448 {
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
449 if (*name < '0' || *name > '9')
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
450 return -EINVAL;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
451
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
452 dev_num = 10 * dev_num + (*name - '0');
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
453 name++;
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
454 }
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
455
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
456 if (dev_num > info->partitions_num)
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
457 return -EINVAL;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
458
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
459 D(("disk lookup dev number = %d\n", dev_num));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
460
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
461 if (0 == dev_num)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
462 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
463 // 0 is the root device number
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
464 return ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
465 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
466 if (0x00 == info->partitions[dev_num-1].type)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
467 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
468 D(("disk NO partition for dev\n"));
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
469 return -EINVAL;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
470 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
471
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
472 new_tab = &chan->pdevs_dev[dev_num-1];
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
473 new_chan = &chan->pdevs_chan[dev_num-1];
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
474
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
475 // copy device data from parent
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
476 *new_tab = **tab;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
477 *new_chan = *chan;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
478
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
479 new_tab->priv = (void *)new_chan;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
480
1685
b1d2762b2eec * src/disk.c:
asl
parents: 1476
diff changeset
481 // set partition ptr
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
482 new_chan->partition = &info->partitions[dev_num-1];
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
483
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
484 // return device tab
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
485 *tab = new_tab;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
486
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
487 return ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
488 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
489
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
490 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
491
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
492 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
493 disk_bread(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
494 void *buf,
2111
0ad51d0b250b * src/disk.c: Add comments that bread/bwrite take the position and
asl
parents: 1685
diff changeset
495 cyg_uint32 *len, // In blocks
0ad51d0b250b * src/disk.c: Add comments that bread/bwrite take the position and
asl
parents: 1685
diff changeset
496 cyg_uint32 pos) // In blocks
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
497 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
498 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *) handle;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
499 disk_channel *chan = (disk_channel *) t->priv;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
500 disk_controller *ctlr = chan->controller;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
501 disk_funs *funs = chan->funs;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
502 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
503 cyg_uint32 size = *len;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
504 cyg_uint8 *bbuf = (cyg_uint8 *)buf;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
505 Cyg_ErrNo res = ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
506 cyg_uint32 last;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
507
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
508 cyg_drv_mutex_lock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
509
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
510 while( ctlr->busy )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
511 cyg_drv_cond_wait( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
512
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
513 if (info->connected && chan->valid)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
514 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
515 ctlr->busy = true;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
516
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
517 if (NULL != chan->partition)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
518 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
519 pos += chan->partition->start;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
520 last = chan->partition->end;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
521 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
522 else
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
523 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
524 last = info->blocks_num-1;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
525 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
526
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
527 D(("disk read block=%d len=%d buf=%p\n", pos, *len, buf));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
528
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
529 while( size > 0 )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
530 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
531 cyg_uint32 tfr = size;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
532
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
533 if (pos > last)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
534 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
535 res = -EIO;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
536 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
537 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
538
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
539 if( tfr > info->ident.max_transfer )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
540 tfr = info->ident.max_transfer;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
541
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
542 ctlr->result = -EWOULDBLOCK;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
543
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
544 cyg_drv_dsr_lock();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
545
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
546 res = (funs->read)(chan, (void*)bbuf, tfr, pos);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
547
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
548 if( res == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
549 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
550 // If the driver replys EWOULDBLOCK, then the transfer is
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
551 // being handled asynchronously and when it is finished it
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
552 // will call disk_transfer_done(). This will wake us up here
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
553 // to continue.
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
554
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
555 while( ctlr->result == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
556 cyg_drv_cond_wait( &ctlr->async );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
557
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
558 res = ctlr->result;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
559 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
560
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
561 cyg_drv_dsr_unlock();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
562
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
563 if (ENOERR != res)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
564 goto done;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
565
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
566 if (!info->connected)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
567 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
568 res = -EINVAL;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
569 goto done;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
570 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
571
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
572 bbuf += tfr * info->block_size;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
573 pos += tfr;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
574 size -= tfr;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
575 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
576
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
577 ctlr->busy = false;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
578 cyg_drv_cond_signal( &ctlr->queue );
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
579 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
580 else
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
581 res = -EINVAL;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
582
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
583 done:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
584
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
585 cyg_drv_mutex_unlock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
586 #ifdef CYGPKG_KERNEL
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
587 cyg_thread_yield();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
588 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
589
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
590 *len -= size;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
591 return res;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
592 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
593
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
594 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
595
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
596 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
597 disk_bwrite(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
598 const void *buf,
2111
0ad51d0b250b * src/disk.c: Add comments that bread/bwrite take the position and
asl
parents: 1685
diff changeset
599 cyg_uint32 *len, // In blocks
0ad51d0b250b * src/disk.c: Add comments that bread/bwrite take the position and
asl
parents: 1685
diff changeset
600 cyg_uint32 pos) // In blocks
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
601 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
602 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *) handle;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
603 disk_channel *chan = (disk_channel *) t->priv;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
604 disk_controller *ctlr = chan->controller;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
605 disk_funs *funs = chan->funs;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
606 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
607 cyg_uint32 size = *len;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
608 cyg_uint8 *bbuf = (cyg_uint8 * const) buf;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
609 Cyg_ErrNo res = ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
610 cyg_uint32 last;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
611
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
612 cyg_drv_mutex_lock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
613
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
614 while( ctlr->busy )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
615 cyg_drv_cond_wait( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
616
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
617 if (info->connected && chan->valid)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
618 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
619 ctlr->busy = true;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
620
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
621 if (NULL != chan->partition)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
622 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
623 pos += chan->partition->start;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
624 last = chan->partition->end;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
625 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
626 else
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
627 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
628 last = info->blocks_num-1;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
629 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
630
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
631 D(("disk write block=%d len=%d buf=%p\n", pos, *len, buf));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
632
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
633 while( size > 0 )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
634 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
635 cyg_uint32 tfr = size;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
636
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
637 if (pos > last)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
638 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
639 res = -EIO;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
640 goto done;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
641 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
642
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
643 if( tfr > info->ident.max_transfer )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
644 tfr = info->ident.max_transfer;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
645
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
646 ctlr->result = -EWOULDBLOCK;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
647
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
648 cyg_drv_dsr_lock();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
649
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
650 res = (funs->write)(chan, (void*)bbuf, tfr, pos);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
651
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
652 if( res == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
653 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
654 // If the driver replys EWOULDBLOCK, then the transfer is
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
655 // being handled asynchronously and when it is finished it
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
656 // will call disk_transfer_done(). This will wake us up here
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
657 // to continue.
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
658
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
659 while( ctlr->result == -EWOULDBLOCK )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
660 cyg_drv_cond_wait( &ctlr->async );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
661
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
662 res = ctlr->result;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
663 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
664
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
665 cyg_drv_dsr_unlock();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
666
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
667 if (ENOERR != res)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
668 goto done;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
669
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
670 if (!info->connected)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
671 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
672 res = -EINVAL;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
673 goto done;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
674 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
675
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
676 bbuf += tfr * info->block_size;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
677 pos += tfr;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
678 size -= tfr;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
679
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
680 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
681
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
682 ctlr->busy = false;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
683 cyg_drv_cond_signal( &ctlr->queue );
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
684 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
685 else
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
686 res = -EINVAL;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
687
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
688 done:
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
689
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
690 cyg_drv_mutex_unlock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
691 #ifdef CYGPKG_KERNEL
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
692 cyg_thread_yield();
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
693 #endif
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
694
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
695 *len -= size;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
696 return res;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
697 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
698
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
699 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
700
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
701 static void disk_transfer_done(struct disk_channel *chan, Cyg_ErrNo res)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
702 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
703 disk_controller *ctlr = chan->controller;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
704
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
705 ctlr->result = res;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
706
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
707 cyg_drv_cond_signal( &ctlr->async );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
708 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
709
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
710 // ---------------------------------------------------------------------------
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
711
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
712 static cyg_bool
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
713 disk_select(cyg_io_handle_t handle, cyg_uint32 which, CYG_ADDRWORD info)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
714 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
715 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *) handle;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
716 disk_channel *chan = (disk_channel *) t->priv;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
717 cyg_disk_info_t *cinfo = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
718
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
719 if (!cinfo->connected || !chan->valid)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
720 return false;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
721 else
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
722 return true;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
723 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
724
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
725 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
726
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
727 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
728 disk_get_config(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
729 cyg_uint32 key,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
730 void *xbuf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
731 cyg_uint32 *len)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
732 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
733 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *) handle;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
734 disk_channel *chan = (disk_channel *) t->priv;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
735 disk_controller *ctlr = chan->controller;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
736 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
737 cyg_disk_info_t *buf = (cyg_disk_info_t *) xbuf;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
738 disk_funs *funs = chan->funs;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
739 Cyg_ErrNo res = ENOERR;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
740
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
741 cyg_drv_mutex_lock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
742
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
743 while( ctlr->busy )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
744 cyg_drv_cond_wait( &ctlr->queue );
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
745
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
746 if (info->connected && chan->valid)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
747 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
748 ctlr->busy = true;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
749
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
750 D(("disk get config key=%d\n", key));
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
751
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
752 switch (key) {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
753 case CYG_IO_GET_CONFIG_DISK_INFO:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
754 if (*len < sizeof(cyg_disk_info_t)) {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
755 res = -EINVAL;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
756 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
757 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
758 D(("chan->info->block_size %u\n", chan->info->block_size ));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
759 D(("chan->info->blocks_num %u\n", chan->info->blocks_num ));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
760 D(("chan->info->phys_block_size %u\n", chan->info->phys_block_size ));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
761 *buf = *chan->info;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
762 *len = sizeof(cyg_disk_info_t);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
763 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
764
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
765 default:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
766 // pass down to lower layers
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
767 res = (funs->get_config)(chan, key, xbuf, len);
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
768 }
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
769
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
770 ctlr->busy = false;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
771 cyg_drv_cond_signal( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
772 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
773 else
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
774 res = -EINVAL;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
775
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
776 cyg_drv_mutex_unlock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
777
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
778 return res;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
779 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
780
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
781 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
782
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
783 static Cyg_ErrNo
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
784 disk_set_config(cyg_io_handle_t handle,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
785 cyg_uint32 key,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
786 const void *xbuf,
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
787 cyg_uint32 *len)
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
788 {
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
789 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *) handle;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
790 disk_channel *chan = (disk_channel *) t->priv;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
791 disk_controller *ctlr = chan->controller;
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
792 cyg_disk_info_t *info = chan->info;
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
793 disk_funs *funs = chan->funs;
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
794 Cyg_ErrNo res = ENOERR;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
795
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
796 cyg_drv_mutex_lock( &ctlr->lock );
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
797
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
798 while( ctlr->busy )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
799 cyg_drv_cond_wait( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
800
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
801 if (info->connected && chan->valid)
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
802 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
803 ctlr->busy = true;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
804
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
805 D(("disk set config key=%d\n", key));
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
806
2300
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
807 switch ( key )
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
808 {
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
809 case CYG_IO_SET_CONFIG_DISK_MOUNT:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
810 chan->mounts++;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
811 info->mounts++;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
812 D(("disk mount: chan %d disk %d\n",chan->mounts, info->mounts));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
813 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
814
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
815 case CYG_IO_SET_CONFIG_DISK_UMOUNT:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
816 chan->mounts--;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
817 info->mounts--;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
818 D(("disk umount: chan %d disk %d\n",chan->mounts, info->mounts));
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
819 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
820
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
821 default:
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
822 break;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
823 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
824
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
825 // pass down to lower layers
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
826 res = (funs->set_config)(chan, key, xbuf, len);
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
827
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
828 ctlr->busy = false;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
829 cyg_drv_cond_signal( &ctlr->queue );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
830 }
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
831 else
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
832 res = -EINVAL;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
833
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
834 cyg_drv_mutex_unlock( &ctlr->lock );
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
835
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
836 return res;
654c837cc618 * include/disk.h (DISK_CHANNEL): No need for extra _part_dev
jlarmour
parents: 2274
diff changeset
837
1476
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
838 }
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
839
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
840 // ---------------------------------------------------------------------------
f2453fae08d4 Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff changeset
841 // EOF disk.c