00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00061 #include <errno.h>
00062
00063 #include <fs/phatfs.h>
00064 #include <fs/phatvol.h>
00065 #include <fs/phatio.h>
00066
00071
00083 static void PhatTableLoc(PHATVOL * vol, u_long clust, int tabnum, u_long * sect, u_long * pos)
00084 {
00085 u_long tabpos = clust * 2;
00086
00087 *sect = vol->vol_tab_sect[tabnum] + tabpos / vol->vol_sectsz;
00088 *pos = tabpos % vol->vol_sectsz;
00089 }
00090
00100 int Phat16GetClusterLink(NUTDEVICE * dev, u_long clust, u_long * link)
00101 {
00102 u_long sect;
00103 u_long pos;
00104 int sbn;
00105 PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00106
00107
00108 if (clust >= (PHATEOC & PHAT16CMASK)) {
00109 return -1;
00110 }
00111
00112
00113 PhatTableLoc(vol, clust, 0, §, &pos);
00114 if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00115 return -1;
00116 }
00117
00118
00119 *link = vol->vol_buf[sbn].sect_data[pos];
00120 *link += (u_long)(vol->vol_buf[sbn].sect_data[pos + 1]) << 8;
00121
00122 return 0;
00123 }
00124
00134 int Phat16SetClusterLink(NUTDEVICE * dev, u_long clust, u_long link)
00135 {
00136 int tabnum;
00137 u_long sect;
00138 u_long pos;
00139 int sbn;
00140 PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00141
00142 for (tabnum = 0; tabnum < 2 && vol->vol_tab_sect[tabnum]; tabnum++) {
00143 PhatTableLoc(vol, clust, tabnum, §, &pos);
00144 if ((sbn = PhatSectorLoad(dev, sect)) < 0) {
00145 return -1;
00146 }
00147 vol->vol_buf[sbn].sect_data[pos] = (u_char) link;
00148 vol->vol_buf[sbn].sect_data[pos + 1] = (u_char) (link >> 8);
00149 vol->vol_buf[sbn].sect_dirty = 1;
00150 }
00151 return 0;
00152 }
00153
00162 int Phat16ReleaseChain(NUTDEVICE * dev, u_long first)
00163 {
00164 u_long next;
00165 PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00166
00167 while (first < (PHATEOC & PHAT16CMASK)) {
00168 if (Phat16GetClusterLink(dev, first, &next)) {
00169
00170 return -1;
00171 }
00172 if (next < 2) {
00173
00174 break;
00175 }
00176 if (Phat16SetClusterLink(dev, first, 0)) {
00177
00178 return -1;
00179 }
00180 vol->vol_numfree++;
00181 first = next;
00182 }
00183 return 0;
00184 }
00185