On Thu, May 23, 2024 at 11:13:08PM +0800, shichao lai wrote: > Thanks for your comprehensive analysis. > I added some pr_info() to check the workflow, and I found that the > uzonesize was not initialized in fact! > > The workflow is shown as below. > Before alauda_read_data(), there are in fact many alauda_check_media(), > but none of them enter the branch of alauda_init_media(), where > uzonesize is set to nonzero value. > The key branch condition is "status[0] & 0x08", which is always > unsatisfied in this repro. > > ``` > alauda_transport > alauda_check_media > if (status[0] & 0x08) // not satisfied > alauda_init_media() > // initialize uzonesize > alauda_read_data > ``` Good work! So the problem is that the driver believes the status[0] & 0x08 test. The way to fix this is to add an "initialized" flag to the alauda_info structure. Then alauda_check_media() should call alauda_init_media() if the 0x08 bit is set in status[0] _or_ if info->initialized is 0. And of course, alauda_check_media() should then set info->initialized to 1 if the alauda_init_media() call succeeds. Would you like to write and test a patch that does this? Alan Stern