#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 |