| #ifndef _ADFS_FS_H | |
| #define _ADFS_FS_H | |
| #include <linux/types.h> | |
| #include <linux/magic.h> | |
| /* | |
| * Disc Record at disc address 0xc00 | |
| */ | |
| struct adfs_discrecord { | |
| __u8 log2secsize; | |
| __u8 secspertrack; | |
| __u8 heads; | |
| __u8 density; | |
| __u8 idlen; | |
| __u8 log2bpmb; | |
| __u8 skew; | |
| __u8 bootoption; | |
| __u8 lowsector; | |
| __u8 nzones; | |
| __le16 zone_spare; | |
| __le32 root; | |
| __le32 disc_size; | |
| __le16 disc_id; | |
| __u8 disc_name[10]; | |
| __le32 disc_type; | |
| __le32 disc_size_high; | |
| __u8 log2sharesize:4; | |
| __u8 unused40:4; | |
| __u8 big_flag:1; | |
| __u8 unused41:1; | |
| __u8 nzones_high; | |
| __le32 format_version; | |
| __le32 root_size; | |
| __u8 unused52[60 - 52]; | |
| }; | |
| #define ADFS_DISCRECORD (0xc00) | |
| #define ADFS_DR_OFFSET (0x1c0) | |
| #define ADFS_DR_SIZE 60 | |
| #define ADFS_DR_SIZE_BITS (ADFS_DR_SIZE << 3) | |
| #ifdef __KERNEL__ | |
| /* | |
| * Calculate the boot block checksum on an ADFS drive. Note that this will | |
| * appear to be correct if the sector contains all zeros, so also check that | |
| * the disk size is non-zero!!! | |
| */ | |
| static inline int adfs_checkbblk(unsigned char *ptr) | |
| { | |
| unsigned int result = 0; | |
| unsigned char *p = ptr + 511; | |
| do { | |
| result = (result & 0xff) + (result >> 8); | |
| result = result + *--p; | |
| } while (p != ptr); | |
| return (result & 0xff) != ptr[511]; | |
| } | |
| #endif | |
| #endif |