blob: 09d07e05102ff21a9e64bee9a92072f53eefc3cd [file] [log] [blame]
Al Cho126bb032010-09-08 00:42:32 -07001#include <linux/slab.h>
2#include "usb.h"
3#include "scsiglue.h"
4#include "smcommon.h"
5#include "smil.h"
6
Rashika Kheria585dc702013-11-01 19:19:57 +05307static int Conv_D_MediaAddr(struct us_data *, DWORD);
8static int Inc_D_MediaAddr(struct us_data *);
9static int Media_D_ReadOneSect(struct us_data *, WORD, BYTE *);
Al Cho126bb032010-09-08 00:42:32 -070010
Rashika Kheria585dc702013-11-01 19:19:57 +053011static int Copy_D_BlockAll(struct us_data *, DWORD);
Al Cho126bb032010-09-08 00:42:32 -070012
Rashika Kheria585dc702013-11-01 19:19:57 +053013static int Assign_D_WriteBlock(void);
14static int Release_D_ReadBlock(struct us_data *);
15static int Release_D_WriteBlock(struct us_data *);
16static int Release_D_CopySector(struct us_data *);
Al Cho126bb032010-09-08 00:42:32 -070017
Rashika Kheria585dc702013-11-01 19:19:57 +053018static int Copy_D_PhyOneSect(struct us_data *);
19static int Read_D_PhyOneSect(struct us_data *, WORD, BYTE *);
20static int Erase_D_PhyOneBlock(struct us_data *);
Al Cho126bb032010-09-08 00:42:32 -070021
Rashika Kheria585dc702013-11-01 19:19:57 +053022static int Set_D_PhyFmtValue(struct us_data *);
23static int Search_D_CIS(struct us_data *);
24static int Make_D_LogTable(struct us_data *);
Al Cho126bb032010-09-08 00:42:32 -070025
Rashika Kheria585dc702013-11-01 19:19:57 +053026static int MarkFail_D_PhyOneBlock(struct us_data *);
Al Cho126bb032010-09-08 00:42:32 -070027
Rashika Kheria665fba02013-11-11 20:39:34 +053028static DWORD ErrCode;
Randy Dunlapd8aba9d2011-05-09 10:46:24 -070029static BYTE WorkBuf[SECTSIZE];
30static BYTE Redundant[REDTSIZE];
31static BYTE WorkRedund[REDTSIZE];
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -070032/* 128 x 1000, Log2Phy[MAX_ZONENUM][MAX_LOGBLOCK]; */
Amarjargal Gundjalam4f3fff72013-05-17 01:06:36 -070033static WORD *Log2Phy[MAX_ZONENUM];
Amarjargal Gundjalame6288702013-05-17 01:04:33 -070034static BYTE Assign[MAX_ZONENUM][MAX_BLOCKNUM / 8];
Randy Dunlapd8aba9d2011-05-09 10:46:24 -070035static WORD AssignStart[MAX_ZONENUM];
Al Cho126bb032010-09-08 00:42:32 -070036WORD ReadBlock;
37WORD WriteBlock;
38DWORD MediaChange;
Randy Dunlapd8aba9d2011-05-09 10:46:24 -070039static DWORD SectCopyMode;
Al Cho126bb032010-09-08 00:42:32 -070040
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -070041/* BIT Control Macro */
Amarjargal Gundjalama3539592013-05-17 01:05:04 -070042static BYTE BitData[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
Amarjargal Gundjalame6288702013-05-17 01:04:33 -070043#define Set_D_Bit(a, b) (a[(BYTE)((b) / 8)] |= BitData[(b) % 8])
44#define Clr_D_Bit(a, b) (a[(BYTE)((b) / 8)] &= ~BitData[(b) % 8])
45#define Chk_D_Bit(a, b) (a[(BYTE)((b) / 8)] & BitData[(b) % 8])
Al Cho126bb032010-09-08 00:42:32 -070046
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -070047/* ----- SM_FreeMem() ------------------------------------------------- */
Al Cho126bb032010-09-08 00:42:32 -070048int SM_FreeMem(void)
49{
50 int i;
51
Cho, Yu-Chen548039f2011-04-01 14:38:42 +080052 pr_info("SM_FreeMem start\n");
Amarjargal Gundjalame6288702013-05-17 01:04:33 -070053 for (i = 0; i < MAX_ZONENUM; i++) {
54 if (Log2Phy[i] != NULL) {
Cho, Yu-Chen548039f2011-04-01 14:38:42 +080055 pr_info("Free Zone = %x, Addr = %p\n", i, Log2Phy[i]);
Al Cho126bb032010-09-08 00:42:32 -070056 kfree(Log2Phy[i]);
57 Log2Phy[i] = NULL;
58 }
59 }
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -070060 return NO_ERROR;
Al Cho126bb032010-09-08 00:42:32 -070061}
62
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -070063/* SmartMedia Read/Write/Erase Function */
64/* ----- Media_D_ReadSector() ------------------------------------------- */
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -070065int Media_D_ReadSector(struct us_data *us, DWORD start, WORD count, BYTE *buf)
Al Cho126bb032010-09-08 00:42:32 -070066{
67 WORD len, bn;
68
Al Cho126bb032010-09-08 00:42:32 -070069 if (Conv_D_MediaAddr(us, start))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -070070 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -070071
Amarjargal Gundjalam05a19ed2013-05-17 01:04:18 -070072 while (1) {
Al Cho126bb032010-09-08 00:42:32 -070073 len = Ssfdc.MaxSectors - Media.Sector;
74 if (count > len)
75 bn = len;
76 else
77 bn = count;
Amarjargal Gundjalamdc606b82013-05-17 01:05:51 -070078
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -070079 if (Media_D_ReadOneSect(us, bn, buf)) {
Al Cho126bb032010-09-08 00:42:32 -070080 ErrCode = ERR_EccReadErr;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -070081 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -070082 }
83
84 Media.Sector += bn;
85 count -= bn;
86
Amarjargal Gundjalame6288702013-05-17 01:04:33 -070087 if (count <= 0)
Al Cho126bb032010-09-08 00:42:32 -070088 break;
89
90 buf += bn * SECTSIZE;
91
92 if (Inc_D_MediaAddr(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -070093 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -070094 }
95
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -070096 return NO_ERROR;
Al Cho126bb032010-09-08 00:42:32 -070097}
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -070098/* here */
99/* ----- Media_D_CopySector() ------------------------------------------ */
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700100int Media_D_CopySector(struct us_data *us, DWORD start, WORD count, BYTE *buf)
Al Cho126bb032010-09-08 00:42:32 -0700101{
Al Cho126bb032010-09-08 00:42:32 -0700102 WORD len, bn;
Al Cho126bb032010-09-08 00:42:32 -0700103
Cho, Yu-Chen548039f2011-04-01 14:38:42 +0800104 /* pr_info("Media_D_CopySector !!!\n"); */
Al Cho126bb032010-09-08 00:42:32 -0700105 if (Conv_D_MediaAddr(us, start))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700106 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -0700107
Amarjargal Gundjalam05a19ed2013-05-17 01:04:18 -0700108 while (1) {
Al Cho126bb032010-09-08 00:42:32 -0700109 if (Assign_D_WriteBlock())
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700110 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700111
112 len = Ssfdc.MaxSectors - Media.Sector;
113 if (count > len)
114 bn = len;
115 else
116 bn = count;
117
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700118 if (Ssfdc_D_CopyBlock(us, bn, buf, Redundant)) {
Al Cho126bb032010-09-08 00:42:32 -0700119 ErrCode = ERR_WriteFault;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700120 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -0700121 }
122
123 Media.Sector = 0x1F;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700124 if (Release_D_CopySector(us)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700125 if (ErrCode == ERR_HwError) {
Al Cho126bb032010-09-08 00:42:32 -0700126 ErrCode = ERR_WriteFault;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700127 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -0700128 }
129 }
130 count -= bn;
131
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700132 if (count <= 0)
Al Cho126bb032010-09-08 00:42:32 -0700133 break;
134
135 buf += bn * SECTSIZE;
136
137 if (Inc_D_MediaAddr(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700138 return ErrCode;
Al Cho126bb032010-09-08 00:42:32 -0700139
140 }
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700141 return NO_ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700142}
143
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700144/* ----- Release_D_CopySector() ------------------------------------------ */
Rashika Kheria585dc702013-11-01 19:19:57 +0530145static int Release_D_CopySector(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700146{
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700147 Log2Phy[Media.Zone][Media.LogBlock] = WriteBlock;
148 Media.PhyBlock = ReadBlock;
Al Cho126bb032010-09-08 00:42:32 -0700149
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700150 if (Media.PhyBlock == NO_ASSIGN) {
151 Media.PhyBlock = WriteBlock;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700152 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700153 }
154
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700155 Clr_D_Bit(Assign[Media.Zone], Media.PhyBlock);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700156 Media.PhyBlock = WriteBlock;
Al Cho126bb032010-09-08 00:42:32 -0700157
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700158 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700159}
Al Cho126bb032010-09-08 00:42:32 -0700160
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700161/* SmartMedia Physical Format Test Subroutine */
162/* ----- Check_D_MediaFmt() --------------------------------------------- */
Al Cho126bb032010-09-08 00:42:32 -0700163int Check_D_MediaFmt(struct us_data *us)
164{
Cho, Yu-Chen548039f2011-04-01 14:38:42 +0800165 pr_info("Check_D_MediaFmt\n");
Al Cho126bb032010-09-08 00:42:32 -0700166
Al Cho126bb032010-09-08 00:42:32 -0700167 if (!MediaChange)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700168 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700169
170 MediaChange = ERROR;
171 SectCopyMode = COMPLETED;
172
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700173 if (Set_D_PhyFmtValue(us)) {
Al Cho126bb032010-09-08 00:42:32 -0700174 ErrCode = ERR_UnknownMedia;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700175 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700176 }
Amarjargal Gundjalam4f3fff72013-05-17 01:06:36 -0700177
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700178 if (Search_D_CIS(us)) {
Al Cho126bb032010-09-08 00:42:32 -0700179 ErrCode = ERR_IllegalFmt;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700180 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700181 }
182
Amarjargal Gundjalam5a5097a2013-05-17 01:06:19 -0700183 MediaChange = SMSUCCESS;
184 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700185}
Amarjargal Gundjalamdc606b82013-05-17 01:05:51 -0700186
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700187/* SmartMedia Physical Address Control Subroutine */
188/* ----- Conv_D_MediaAddr() --------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530189static int Conv_D_MediaAddr(struct us_data *us, DWORD addr)
Al Cho126bb032010-09-08 00:42:32 -0700190{
191 DWORD temp;
Al Cho126bb032010-09-08 00:42:32 -0700192
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700193 temp = addr / Ssfdc.MaxSectors;
194 Media.Zone = (BYTE) (temp / Ssfdc.MaxLogBlocks);
Al Cho126bb032010-09-08 00:42:32 -0700195
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700196 if (Log2Phy[Media.Zone] == NULL) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700197 if (Make_D_LogTable(us)) {
Al Cho126bb032010-09-08 00:42:32 -0700198 ErrCode = ERR_IllegalFmt;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700199 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700200 }
201 }
202
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700203 Media.Sector = (BYTE) (addr % Ssfdc.MaxSectors);
204 Media.LogBlock = (WORD) (temp % Ssfdc.MaxLogBlocks);
Al Cho126bb032010-09-08 00:42:32 -0700205
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700206 if (Media.Zone < Ssfdc.MaxZones) {
Al Cho126bb032010-09-08 00:42:32 -0700207 Clr_D_RedundantData(Redundant);
208 Set_D_LogBlockAddr(Redundant);
209 Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock];
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700210 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700211 }
212
213 ErrCode = ERR_OutOfLBA;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700214 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700215}
216
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700217/* ----- Inc_D_MediaAddr() ---------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530218static int Inc_D_MediaAddr(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700219{
220 WORD LogBlock = Media.LogBlock;
Al Cho126bb032010-09-08 00:42:32 -0700221
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700222 if (++Media.Sector < Ssfdc.MaxSectors)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700223 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700224
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700225 if (Log2Phy[Media.Zone] == NULL) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700226 if (Make_D_LogTable(us)) {
Al Cho126bb032010-09-08 00:42:32 -0700227 ErrCode = ERR_IllegalFmt;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700228 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700229 }
230 }
231
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700232 Media.Sector = 0;
Al Cho126bb032010-09-08 00:42:32 -0700233 Media.LogBlock = LogBlock;
234
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700235 if (++Media.LogBlock < Ssfdc.MaxLogBlocks) {
Al Cho126bb032010-09-08 00:42:32 -0700236 Clr_D_RedundantData(Redundant);
237 Set_D_LogBlockAddr(Redundant);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700238 Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock];
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700239 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700240 }
241
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700242 Media.LogBlock = 0;
Al Cho126bb032010-09-08 00:42:32 -0700243
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700244 if (++Media.Zone < Ssfdc.MaxZones) {
245 if (Log2Phy[Media.Zone] == NULL) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700246 if (Make_D_LogTable(us)) {
Al Cho126bb032010-09-08 00:42:32 -0700247 ErrCode = ERR_IllegalFmt;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700248 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700249 }
250 }
251
252 Media.LogBlock = 0;
253
254 Clr_D_RedundantData(Redundant);
255 Set_D_LogBlockAddr(Redundant);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700256 Media.PhyBlock = Log2Phy[Media.Zone][Media.LogBlock];
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700257 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700258 }
259
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700260 Media.Zone = 0;
Al Cho126bb032010-09-08 00:42:32 -0700261 ErrCode = ERR_OutOfLBA;
262
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700263 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700264}
Al Cho126bb032010-09-08 00:42:32 -0700265
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700266/* SmartMedia Read/Write Subroutine with Retry */
267/* ----- Media_D_ReadOneSect() ------------------------------------------ */
Rashika Kheria585dc702013-11-01 19:19:57 +0530268static int Media_D_ReadOneSect(struct us_data *us, WORD count, BYTE *buf)
Al Cho126bb032010-09-08 00:42:32 -0700269{
270 DWORD err, retry;
271
272 if (!Read_D_PhyOneSect(us, count, buf))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700273 return SMSUCCESS;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700274 if (ErrCode == ERR_HwError)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700275 return ERROR;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700276 if (ErrCode == ERR_DataStatus)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700277 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700278
279#ifdef RDERR_REASSIGN
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200280 if (Ssfdc.Attribute & MWP) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700281 if (ErrCode == ERR_CorReadErr)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700282 return SMSUCCESS;
283 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700284 }
285
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700286 err = ErrCode;
287 for (retry = 0; retry < 2; retry++) {
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700288 if (Copy_D_BlockAll(us,
289 (err == ERR_EccReadErr) ? REQ_FAIL : REQ_ERASE)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700290 if (ErrCode == ERR_HwError)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700291 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700292 continue;
293 }
294
295 ErrCode = err;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700296 if (ErrCode == ERR_CorReadErr)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700297 return SMSUCCESS;
298 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700299 }
300
301 MediaChange = ERROR;
302#else
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700303 if (ErrCode == ERR_CorReadErr)
304 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700305#endif
306
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700307 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700308}
Al Cho126bb032010-09-08 00:42:32 -0700309
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700310/* SmartMedia Physical Sector Data Copy Subroutine */
311/* ----- Copy_D_BlockAll() ---------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530312static int Copy_D_BlockAll(struct us_data *us, DWORD mode)
Al Cho126bb032010-09-08 00:42:32 -0700313{
314 BYTE sect;
Al Cho126bb032010-09-08 00:42:32 -0700315
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700316 sect = Media.Sector;
Al Cho126bb032010-09-08 00:42:32 -0700317
318 if (Assign_D_WriteBlock())
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700319 return ERROR;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700320 if (mode == REQ_FAIL)
321 SectCopyMode = REQ_FAIL;
Al Cho126bb032010-09-08 00:42:32 -0700322
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700323 for (Media.Sector = 0; Media.Sector < Ssfdc.MaxSectors;
324 Media.Sector++) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700325 if (Copy_D_PhyOneSect(us)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700326 if (ErrCode == ERR_HwError)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700327 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700328 if (Release_D_WriteBlock(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700329 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700330
331 ErrCode = ERR_WriteFault;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700332 Media.PhyBlock = ReadBlock;
333 Media.Sector = sect;
Al Cho126bb032010-09-08 00:42:32 -0700334
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700335 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700336 }
337 }
338
339 if (Release_D_ReadBlock(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700340 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700341
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700342 Media.PhyBlock = WriteBlock;
343 Media.Sector = sect;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700344 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700345}
Al Cho126bb032010-09-08 00:42:32 -0700346
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700347/* SmartMedia Physical Block Assign/Release Subroutine */
348/* ----- Assign_D_WriteBlock() ------------------------------------------ */
Rashika Kheria585dc702013-11-01 19:19:57 +0530349static int Assign_D_WriteBlock(void)
Al Cho126bb032010-09-08 00:42:32 -0700350{
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700351 ReadBlock = Media.PhyBlock;
Al Cho126bb032010-09-08 00:42:32 -0700352
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700353 for (WriteBlock = AssignStart[Media.Zone];
354 WriteBlock < Ssfdc.MaxBlocks; WriteBlock++) {
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700355 if (!Chk_D_Bit(Assign[Media.Zone], WriteBlock)) {
356 Set_D_Bit(Assign[Media.Zone], WriteBlock);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700357 AssignStart[Media.Zone] = WriteBlock + 1;
358 Media.PhyBlock = WriteBlock;
359 SectCopyMode = REQ_ERASE;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700360 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700361 }
362 }
363
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700364 for (WriteBlock = 0;
365 WriteBlock < AssignStart[Media.Zone]; WriteBlock++) {
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700366 if (!Chk_D_Bit(Assign[Media.Zone], WriteBlock)) {
367 Set_D_Bit(Assign[Media.Zone], WriteBlock);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700368 AssignStart[Media.Zone] = WriteBlock + 1;
369 Media.PhyBlock = WriteBlock;
370 SectCopyMode = REQ_ERASE;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700371 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700372 }
373 }
374
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700375 WriteBlock = NO_ASSIGN;
Al Cho126bb032010-09-08 00:42:32 -0700376 ErrCode = ERR_WriteFault;
Amarjargal Gundjalamdc606b82013-05-17 01:05:51 -0700377
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700378 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700379}
380
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700381/* ----- Release_D_ReadBlock() ------------------------------------------ */
Rashika Kheria585dc702013-11-01 19:19:57 +0530382static int Release_D_ReadBlock(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700383{
384 DWORD mode;
Al Cho126bb032010-09-08 00:42:32 -0700385
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700386 mode = SectCopyMode;
387 SectCopyMode = COMPLETED;
Al Cho126bb032010-09-08 00:42:32 -0700388
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700389 if (mode == COMPLETED)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700390 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700391
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700392 Log2Phy[Media.Zone][Media.LogBlock] = WriteBlock;
393 Media.PhyBlock = ReadBlock;
Al Cho126bb032010-09-08 00:42:32 -0700394
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700395 if (Media.PhyBlock == NO_ASSIGN) {
396 Media.PhyBlock = WriteBlock;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700397 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700398 }
399
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700400 if (mode == REQ_ERASE) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700401 if (Erase_D_PhyOneBlock(us)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700402 if (ErrCode == ERR_HwError)
403 return ERROR;
404 if (MarkFail_D_PhyOneBlock(us))
405 return ERROR;
Amarjargal Gundjalame1a1c482013-05-17 01:03:15 -0700406 } else
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700407 Clr_D_Bit(Assign[Media.Zone], Media.PhyBlock);
Amarjargal Gundjalame1a1c482013-05-17 01:03:15 -0700408 } else if (MarkFail_D_PhyOneBlock(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700409 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700410
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700411 Media.PhyBlock = WriteBlock;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700412 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700413}
414
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700415/* ----- Release_D_WriteBlock() ----------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530416static int Release_D_WriteBlock(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700417{
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700418 SectCopyMode = COMPLETED;
419 Media.PhyBlock = WriteBlock;
Al Cho126bb032010-09-08 00:42:32 -0700420
421 if (MarkFail_D_PhyOneBlock(us))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700422 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700423
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700424 Media.PhyBlock = ReadBlock;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700425 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700426}
427
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700428/* SmartMedia Physical Sector Data Copy Subroutine */
429/* ----- Copy_D_PhyOneSect() -------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530430static int Copy_D_PhyOneSect(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700431{
432 int i;
433 DWORD err, retry;
Al Cho126bb032010-09-08 00:42:32 -0700434
Masanari Iidab1639702013-12-12 22:22:59 +0900435 /* pr_info("Copy_D_PhyOneSect --- Sector = %x\n", Media.Sector); */
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700436 if (ReadBlock != NO_ASSIGN) {
437 Media.PhyBlock = ReadBlock;
438 for (retry = 0; retry < 2; retry++) {
439 if (retry != 0) {
Al Cho126bb032010-09-08 00:42:32 -0700440 Ssfdc_D_Reset(us);
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700441 if (Ssfdc_D_ReadCisSect(us, WorkBuf,
442 WorkRedund)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700443 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700444 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700445 return ERROR;
446 }
Al Cho126bb032010-09-08 00:42:32 -0700447
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700448 if (Check_D_CISdata(WorkBuf, WorkRedund)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700449 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700450 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700451 return ERROR;
452 }
Al Cho126bb032010-09-08 00:42:32 -0700453 }
454
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700455 if (Ssfdc_D_ReadSect(us, WorkBuf, WorkRedund)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700456 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700457 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700458 return ERROR;
459 }
460 if (Check_D_DataStatus(WorkRedund)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700461 err = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700462 break;
463 }
464 if (!Check_D_ReadError(WorkRedund)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700465 err = SMSUCCESS;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700466 break;
467 }
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700468 if (!Check_D_Correct(WorkBuf, WorkRedund)) {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700469 err = SMSUCCESS;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700470 break;
471 }
Al Cho126bb032010-09-08 00:42:32 -0700472
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700473 err = ERROR;
474 SectCopyMode = REQ_FAIL;
Al Cho126bb032010-09-08 00:42:32 -0700475 }
Amarjargal Gundjalame1a1c482013-05-17 01:03:15 -0700476 } else {
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700477 err = SMSUCCESS;
478 for (i = 0; i < SECTSIZE; i++)
479 WorkBuf[i] = DUMMY_DATA;
Al Cho126bb032010-09-08 00:42:32 -0700480 Clr_D_RedundantData(WorkRedund);
481 }
482
483 Set_D_LogBlockAddr(WorkRedund);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700484 if (err == ERROR) {
Al Cho126bb032010-09-08 00:42:32 -0700485 Set_D_RightECC(WorkRedund);
486 Set_D_DataStaus(WorkRedund);
487 }
488
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700489 Media.PhyBlock = WriteBlock;
Al Cho126bb032010-09-08 00:42:32 -0700490
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700491 if (Ssfdc_D_WriteSectForCopy(us, WorkBuf, WorkRedund)) {
492 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700493 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700494 return ERROR;
495 }
496 if (Ssfdc_D_CheckStatus()) {
497 ErrCode = ERR_WriteFault;
498 return ERROR;
499 }
Al Cho126bb032010-09-08 00:42:32 -0700500
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700501 Media.PhyBlock = ReadBlock;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700502 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700503}
504
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700505/* SmartMedia Physical Sector Read/Write/Erase Subroutine */
506/* ----- Read_D_PhyOneSect() -------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530507static int Read_D_PhyOneSect(struct us_data *us, WORD count, BYTE *buf)
Al Cho126bb032010-09-08 00:42:32 -0700508{
509 int i;
510 DWORD retry;
Al Cho126bb032010-09-08 00:42:32 -0700511
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700512 if (Media.PhyBlock == NO_ASSIGN) {
513 for (i = 0; i < SECTSIZE; i++)
514 *buf++ = DUMMY_DATA;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700515 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700516 }
517
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700518 for (retry = 0; retry < 2; retry++) {
519 if (retry != 0) {
Al Cho126bb032010-09-08 00:42:32 -0700520 Ssfdc_D_Reset(us);
521
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700522 if (Ssfdc_D_ReadCisSect(us, WorkBuf, WorkRedund)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700523 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700524 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700525 return ERROR;
526 }
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700527 if (Check_D_CISdata(WorkBuf, WorkRedund)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700528 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700529 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700530 return ERROR;
531 }
Al Cho126bb032010-09-08 00:42:32 -0700532 }
533
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700534 if (Ssfdc_D_ReadBlock(us, count, buf, Redundant)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700535 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700536 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700537 return ERROR;
538 }
539 if (Check_D_DataStatus(Redundant)) {
540 ErrCode = ERR_DataStatus;
541 return ERROR;
542 }
Al Cho126bb032010-09-08 00:42:32 -0700543
544 if (!Check_D_ReadError(Redundant))
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700545 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700546
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700547 if (!Check_D_Correct(buf, Redundant)) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700548 ErrCode = ERR_CorReadErr;
549 return ERROR;
550 }
Al Cho126bb032010-09-08 00:42:32 -0700551 }
552
553 ErrCode = ERR_EccReadErr;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700554 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700555}
Al Cho126bb032010-09-08 00:42:32 -0700556
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700557/* ----- Erase_D_PhyOneBlock() ------------------------------------------ */
Rashika Kheria585dc702013-11-01 19:19:57 +0530558static int Erase_D_PhyOneBlock(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700559{
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700560 if (Ssfdc_D_EraseBlock(us)) {
561 ErrCode = ERR_HwError;
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700562 MediaChange = ERROR;
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700563 return ERROR;
564 }
565 if (Ssfdc_D_CheckStatus()) {
566 ErrCode = ERR_WriteFault;
567 return ERROR;
568 }
Al Cho126bb032010-09-08 00:42:32 -0700569
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700570 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700571}
572
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700573/* SmartMedia Physical Format Check Local Subroutine */
574/* ----- Set_D_PhyFmtValue() -------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530575static int Set_D_PhyFmtValue(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700576{
Amarjargal Gundjalam5a5097a2013-05-17 01:06:19 -0700577 if (Set_D_SsfdcModel(us->SM_DeviceID))
578 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700579
Amarjargal Gundjalam5a5097a2013-05-17 01:06:19 -0700580 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700581}
582
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700583/* ----- Search_D_CIS() ------------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530584static int Search_D_CIS(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700585{
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700586 Media.Zone = 0;
587 Media.Sector = 0;
Al Cho126bb032010-09-08 00:42:32 -0700588
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700589 for (Media.PhyBlock = 0;
590 Media.PhyBlock < (Ssfdc.MaxBlocks - Ssfdc.MaxLogBlocks - 1);
591 Media.PhyBlock++) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700592 if (Ssfdc_D_ReadRedtData(us, Redundant)) {
Al Cho126bb032010-09-08 00:42:32 -0700593 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700594 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700595 }
596
597 if (!Check_D_FailBlock(Redundant))
598 break;
599 }
600
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700601 if (Media.PhyBlock == (Ssfdc.MaxBlocks - Ssfdc.MaxLogBlocks - 1)) {
Al Cho126bb032010-09-08 00:42:32 -0700602 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700603 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700604 }
605
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700606 while (Media.Sector < CIS_SEARCH_SECT) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700607 if (Media.Sector) {
608 if (Ssfdc_D_ReadRedtData(us, Redundant)) {
Al Cho126bb032010-09-08 00:42:32 -0700609 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700610 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700611 }
612 }
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700613 if (!Check_D_DataStatus(Redundant)) {
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700614 if (Ssfdc_D_ReadSect(us, WorkBuf, Redundant)) {
Al Cho126bb032010-09-08 00:42:32 -0700615 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700616 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700617 }
618
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700619 if (Check_D_CISdata(WorkBuf, Redundant)) {
Al Cho126bb032010-09-08 00:42:32 -0700620 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700621 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700622 }
623
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700624 CisArea.PhyBlock = Media.PhyBlock;
625 CisArea.Sector = Media.Sector;
Al Cho126bb032010-09-08 00:42:32 -0700626 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700627 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700628 }
629
630 Media.Sector++;
631 }
632
633 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700634 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700635}
636
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700637/* ----- Make_D_LogTable() ---------------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530638static int Make_D_LogTable(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700639{
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700640 WORD phyblock, logblock;
Al Cho126bb032010-09-08 00:42:32 -0700641
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700642 if (Log2Phy[Media.Zone] == NULL) {
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700643 Log2Phy[Media.Zone] = kmalloc(MAX_LOGBLOCK * sizeof(WORD),
644 GFP_KERNEL);
Cho, Yu-Chen548039f2011-04-01 14:38:42 +0800645 /* pr_info("ExAllocatePool Zone = %x, Addr = %x\n",
646 Media.Zone, Log2Phy[Media.Zone]); */
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700647 if (Log2Phy[Media.Zone] == NULL)
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700648 return ERROR;
Al Cho126bb032010-09-08 00:42:32 -0700649 }
650
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700651 Media.Sector = 0;
Al Cho126bb032010-09-08 00:42:32 -0700652
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200653 /* pr_info("Make_D_LogTable --- MediaZone = 0x%x\n",
654 Media.Zone); */
655 for (Media.LogBlock = 0; Media.LogBlock < Ssfdc.MaxLogBlocks;
656 Media.LogBlock++)
657 Log2Phy[Media.Zone][Media.LogBlock] = NO_ASSIGN;
Al Cho126bb032010-09-08 00:42:32 -0700658
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200659 for (Media.PhyBlock = 0; Media.PhyBlock < (MAX_BLOCKNUM / 8);
660 Media.PhyBlock++)
661 Assign[Media.Zone][Media.PhyBlock] = 0x00;
Al Cho126bb032010-09-08 00:42:32 -0700662
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200663 for (Media.PhyBlock = 0; Media.PhyBlock < Ssfdc.MaxBlocks;
664 Media.PhyBlock++) {
665 if ((!Media.Zone) && (Media.PhyBlock <= CisArea.PhyBlock)) {
Amarjargal Gundjalam99b49742013-05-17 01:04:02 -0700666 Set_D_Bit(Assign[Media.Zone], Media.PhyBlock);
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200667 continue;
668 }
Al Cho126bb032010-09-08 00:42:32 -0700669
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200670 if (Ssfdc_D_ReadRedtData(us, Redundant)) {
671 Ssfdc_D_Reset(us);
672 return ERROR;
673 }
Al Cho126bb032010-09-08 00:42:32 -0700674
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200675 if (!Check_D_DataBlank(Redundant))
676 continue;
Al Cho126bb032010-09-08 00:42:32 -0700677
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200678 Set_D_Bit(Assign[Media.Zone], Media.PhyBlock);
Al Cho126bb032010-09-08 00:42:32 -0700679
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200680 if (Check_D_FailBlock(Redundant))
681 continue;
Al Cho126bb032010-09-08 00:42:32 -0700682
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200683 if (Load_D_LogBlockAddr(Redundant))
684 continue;
685
686 if (Media.LogBlock >= Ssfdc.MaxLogBlocks)
687 continue;
688
689 if (Log2Phy[Media.Zone][Media.LogBlock] == NO_ASSIGN) {
690 Log2Phy[Media.Zone][Media.LogBlock] = Media.PhyBlock;
691 continue;
692 }
693
694 phyblock = Media.PhyBlock;
695 logblock = Media.LogBlock;
696 Media.Sector = (BYTE)(Ssfdc.MaxSectors - 1);
697
698 if (Ssfdc_D_ReadRedtData(us, Redundant)) {
699 Ssfdc_D_Reset(us);
700 return ERROR;
701 }
702
703 if (!Load_D_LogBlockAddr(Redundant) &&
704 (Media.LogBlock == logblock)) {
705 Media.PhyBlock = Log2Phy[Media.Zone][logblock];
Al Cho126bb032010-09-08 00:42:32 -0700706
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700707 if (Ssfdc_D_ReadRedtData(us, Redundant)) {
708 Ssfdc_D_Reset(us);
709 return ERROR;
710 }
Al Cho126bb032010-09-08 00:42:32 -0700711
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700712 Media.PhyBlock = phyblock;
Al Cho126bb032010-09-08 00:42:32 -0700713
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200714 if (!Load_D_LogBlockAddr(Redundant)) {
715 if (Media.LogBlock != logblock) {
716 Media.PhyBlock =
717 Log2Phy[Media.Zone][logblock];
718 Log2Phy[Media.Zone][logblock] =
719 phyblock;
720 }
721 } else {
722 Media.PhyBlock = Log2Phy[Media.Zone][logblock];
723 Log2Phy[Media.Zone][logblock] = phyblock;
724 }
725 }
Al Cho126bb032010-09-08 00:42:32 -0700726
Johannes Schilling0ea8a162013-06-06 18:10:50 +0200727 Media.Sector = 0;
728 Media.PhyBlock = phyblock;
729
730 AssignStart[Media.Zone] = 0;
Al Cho126bb032010-09-08 00:42:32 -0700731
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700732 } /* End for (Media.Zone<MAX_ZONENUM) */
Al Cho126bb032010-09-08 00:42:32 -0700733
734 Ssfdc_D_Reset(us);
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700735 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700736}
737
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700738/* ----- MarkFail_D_PhyOneBlock() --------------------------------------- */
Rashika Kheria585dc702013-11-01 19:19:57 +0530739static int MarkFail_D_PhyOneBlock(struct us_data *us)
Al Cho126bb032010-09-08 00:42:32 -0700740{
741 BYTE sect;
Al Cho126bb032010-09-08 00:42:32 -0700742
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700743 sect = Media.Sector;
Al Cho126bb032010-09-08 00:42:32 -0700744 Set_D_FailBlock(WorkRedund);
Al Cho126bb032010-09-08 00:42:32 -0700745
Amarjargal Gundjalamb9594b82013-05-17 01:06:49 -0700746 for (Media.Sector = 0; Media.Sector < Ssfdc.MaxSectors;
747 Media.Sector++) {
Amarjargal Gundjalam23f73b32013-05-17 01:02:50 -0700748 if (Ssfdc_D_WriteRedtData(us, WorkRedund)) {
Al Cho126bb032010-09-08 00:42:32 -0700749 Ssfdc_D_Reset(us);
750 Media.Sector = sect;
751 ErrCode = ERR_HwError;
752 MediaChange = ERROR;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700753 return ERROR;
Amarjargal Gundjalam1557a642013-05-17 01:06:05 -0700754 } /* NO Status Check */
Al Cho126bb032010-09-08 00:42:32 -0700755 }
756
757 Ssfdc_D_Reset(us);
Amarjargal Gundjalame6288702013-05-17 01:04:33 -0700758 Media.Sector = sect;
Amarjargal Gundjalam2ef0b9c2013-05-17 01:02:22 -0700759 return SMSUCCESS;
Al Cho126bb032010-09-08 00:42:32 -0700760}