A method for operating a storage controller, the method comprising: receiving a first read command from a host device; in response to the first read command, performing a first read of data stored in a nonvolatile memory using a first read level and receiving a first read data; performing first error correction decoding of the first read data to determine whether the first error correction decoding succeeds; in response to failure of the first error correction decoding, determining a second read level different from the first read level using predetermined methods and determining a first soft decision offset value of the second read level; reading data stored in the nonvolatile memory using the determined second read level and the first soft decision offset value and receiving a first soft decision data; performing second error correction decoding of the first soft decision data to determine whether the second error correction decoding succeeds; and in response to success of the second error correction decoding, storing the second read level, a first method used to determine the second read level and the first soft decision offset value as a history log, wherein determining the first soft decision offset value of the second read level includes: applying a predetermined offset to the second read level to perform a read operation, and determining the first soft decision offset value on the basis of a result of the read operation. receiving a first read command from a host device; in response to the first read command, performing a first read of data stored in a nonvolatile memory using a first read level and receiving a first read data; performing first error correction decoding of the first read data to determine whether the first error correction decoding succeeds; in response to failure of the first error correction decoding, determining a second read level different from the first read level using predetermined methods and determining a first soft decision offset value of the second read level; reading data stored in the nonvolatile memory using the determined second read level and the first soft decision offset value and receiving a first soft decision data; performing second error correction decoding of the first soft decision data to determine whether the second error correction decoding succeeds; and determining a second read level different from the first read level using predetermined methods and determining a first soft decision offset value of the second read level; reading data stored in the nonvolatile memory using the determined second read level and the first soft decision offset value and receiving a first soft decision data; performing second error correction decoding of the first soft decision data to determine whether the second error correction decoding succeeds; and in response to success of the second error correction decoding, storing the second read level, a first method used to determine the second read level and the first soft decision offset value as a history log, wherein determining the first soft decision offset value of the second read level includes: applying a predetermined offset to the second read level to perform a read operation, and determining the first soft decision offset value on the basis of a result of the read operation. applying a predetermined offset to the second read level to perform a read operation, and determining the first soft decision offset value on the basis of a result of the read operation. <EOS>