07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

125 /*<br />

126 * The following fields can be written to by the host specific code.<br />

127 * Everything else should be left alone.<br />

128 */<br />

129 struct scsi_pointer SCp; /* Scratchpad used by some host adapters<br />

*/<br />

130<br />

131 unsigned char *host_scribble; /* The host adapter is allowed to<br />

132 * call scsi_malloc and get some memory<br />

133 * and hang it here. The host adapter<br />

134 * is also expected to call scsi_free<br />

135 * to release this memory. (The<br />

memory<br />

136 * obtained by scsi_malloc is guaranteed<br />

137 * to be at an address < 16Mb). */<br />

138<br />

139 int result; /* Status code from lower level driver */<br />

140<br />

141 unsigned char tag; /* SCSI-II queued command tag */<br />

142 unsigned long pid; /* Process ID, starts at 0 */<br />

143 };<br />

我算是看明白了,凡是涉及scsi 那边的数据结构就没有一个不变态,写代码的人成心就想吓唬我们.可<br />

是我们作为共产主义接班人,怎能被这些吓倒呢.不过还好,我们只要知道有这么一个数据结构就可以了,同<br />

时需要知道在us 中有一个成员srb,由它来指向scsi 命令.知道这些足矣.继续说176 行,看一下us->srb<br />

是不是为空,如果为空我们才可以继续往下走去唤醒那个守护进程,否则就说明人家那边之前的一个命令还<br />

没有执行完.你问为什么?到时候你完后看就知道了,人家那边执行完一个命令就会把它设为空.而作为第一<br />

次来说,显然us->srb 为空,因为还没有任何人为它赋过值,只是初始化us 的时候把所有元素都初始化为0<br />

了,所以这第一次来到这里的时候肯定是空.这里如果不为空就返回SCSI_MLQUEUE_HOST_BUSY 给<br />

scsi core,这样核心层就知道,人家这边host 忙着呢,先不急着执行下面的命令.<br />

183行, US_FLIDX_DISCONNECTING这个flag 我们已经遇见多次了,已经无需多讲,现在只是不知<br />

道究竟是哪里设置了这个flag,日后我们看到storage_disconnect 就知道了.这里和以往一样,如果这个<br />

flag 设置了,就别浪费大家的感情了,赶紧结束吧.设置srb->result 让scsi core 知道这里已经断开连接<br />

了.<br />

而queuecommand 命令本身就返回0.不过我们需要注意的是186 行这个done 函数,仔细看这个done<br />

是queuecommand()函数的第二个参数,是一个函数指针,实际上scsi core 调用queuecommand 的时<br />

候传递的参数名字就叫做scsi_done,这就是一个函数名,scsi 核心层定义了一个叫做scsi_done 的函<br />

数,scsi 核心层要求当低层的驱动程序完成一个命令后要调用这个函数去通知scsi 核心层,这实际上就相<br />

当<br />

于一种中断机制,scsi 核心层调用了queuecommand()之后它就不管事了,它就去干别的了,等你底层的<br />

代<br />

码把这个queuecommand 执行完了之后,或者准确地说当你底层把命令执行完了之后,你就调用<br />

scsi_done 从而scsi 核心层就知道你这个命令完成了,然后它就会接着做一些它该做的事情比如清理这个<br />

命令,或者别的一些收尾的工作.所以这里我们看到,如果设备已经设置了断开的flag,那么这里就执行done,<br />

如果没有断开那就在下面的190 行设置srb->scsi_done 等于这个done,实际上就是等于scsi_done,这

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!