Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _ADFS_FS_H |
2 | #define _ADFS_FS_H | |
3 | ||
4 | #include <linux/types.h> | |
e18fa700 | 5 | #include <linux/magic.h> |
1da177e4 LT |
6 | |
7 | /* | |
8 | * Disc Record at disc address 0xc00 | |
9 | */ | |
10 | struct adfs_discrecord { | |
11 | __u8 log2secsize; | |
12 | __u8 secspertrack; | |
13 | __u8 heads; | |
14 | __u8 density; | |
15 | __u8 idlen; | |
16 | __u8 log2bpmb; | |
17 | __u8 skew; | |
18 | __u8 bootoption; | |
19 | __u8 lowsector; | |
20 | __u8 nzones; | |
21 | __le16 zone_spare; | |
22 | __le32 root; | |
23 | __le32 disc_size; | |
24 | __le16 disc_id; | |
25 | __u8 disc_name[10]; | |
26 | __le32 disc_type; | |
27 | __le32 disc_size_high; | |
28 | __u8 log2sharesize:4; | |
29 | __u8 unused40:4; | |
30 | __u8 big_flag:1; | |
31 | __u8 unused41:1; | |
32 | __u8 nzones_high; | |
33 | __le32 format_version; | |
34 | __le32 root_size; | |
35 | __u8 unused52[60 - 52]; | |
36 | }; | |
37 | ||
38 | #define ADFS_DISCRECORD (0xc00) | |
39 | #define ADFS_DR_OFFSET (0x1c0) | |
40 | #define ADFS_DR_SIZE 60 | |
41 | #define ADFS_DR_SIZE_BITS (ADFS_DR_SIZE << 3) | |
1da177e4 LT |
42 | |
43 | #ifdef __KERNEL__ | |
1da177e4 LT |
44 | /* |
45 | * Calculate the boot block checksum on an ADFS drive. Note that this will | |
46 | * appear to be correct if the sector contains all zeros, so also check that | |
47 | * the disk size is non-zero!!! | |
48 | */ | |
49 | static inline int adfs_checkbblk(unsigned char *ptr) | |
50 | { | |
51 | unsigned int result = 0; | |
52 | unsigned char *p = ptr + 511; | |
53 | ||
54 | do { | |
55 | result = (result & 0xff) + (result >> 8); | |
56 | result = result + *--p; | |
57 | } while (p != ptr); | |
58 | ||
59 | return (result & 0xff) != ptr[511]; | |
60 | } | |
1da177e4 LT |
61 | #endif |
62 | ||
63 | #endif |