07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

所以对于那些不能相应INQUIRY命令的设备,当上层的驱动程序去INQUIRY的时候,实际上是调用我们<br />

的queuecommand,那么我们根本就不用和下面的硬件去打交道,就直接回复上层,即我们从软件上来准<br />

备这个一段INQUIRY 数据给上层,这才是我们这个函数的目的.真正的和硬件打交道的代码在后面,我们还<br />

没走到那一步.到了那一步再说.<br />

彼岸花的传说(八)<br />

对于use_sg 为0 的情况,我们接下来再看206 行,<strong>of</strong>fset 是函数调用传递进来的参数,注释里说的很清<br />

楚,就是用来标志偏移量的,每次copy 几个字节她就增加几,最大她也不能超过request_bufflen,这是显<br />

然<br />

的.usb_stor_access_xfer_buf()这个函数所做的事情就是从srb->request_buffer 往buffer 里边<br />

copy 数据,或者反过来从buffer 往srb->request_buffer,然后返回copy 了多少个字节.对于<strong>of</strong>fset 大<br />

于等于request_bufflen 的情况,当然就直接返回0 了,因为request_buffer 已经满了.<br />

参数enum xfer_buf_dir dir 标志的正是传输方向,这个数据类型是在某个猥琐的角落里被定义<br />

的,drivers/usb/storage/protocol.h 中:<br />

68 /* struct scsi_cmnd transfer buffer access utilities */<br />

69 enum xfer_buf_dir {TO_XFER_BUF, FROM_XFER_BUF};<br />

其实是很简单的一个枚举数据类型,含义也很简单,一个表示向srb->request_buffer 里边<br />

copy,TO_XFER_BUF,另一个表示从srb->request_buffer 里边往外copy,FROM_XFER_BUF.(题外<br />

话:XFER 就是TRANSFER 的意思,老外喜欢这样缩写.刚进Intel 的时候老板专门给了我一个excel 文<br />

件,<br />

里边全是Intel 内部广泛使用的英文缩写,不在Intel 呆一段时间基本没法理解.)这里定义成枚举数据类型<br />

也是很有必要的,因为数据传输肯定得有且仅有一个方向,就像思念,只有一个方向,因为我思念的人未必思<br />

念我. 而此情此景,咱们传进来的是前者,所以209 行判断之后会执行210 行,从buffer 里边copy cnt 个<br />

字节到(unsigned char *) srb->request_buffer + *<strong>of</strong>fset 去.cnt 在208 行确定,min 函数不用说也<br />

知道,取最小值,认真学过谭浩强老师那本书的同志们应该不会不熟悉这样的函数,不过linux 内核里边确实<br />

有定义这个函数,include/linux/kernel.h 中,不妨也列出来,仅供娱乐,毕竟咱们的故事太严肃了一点,娱<br />

乐<br />

性不够强:<br />

203 /*<br />

204 * min()/max() macros that also do<br />

205 * strict type-checking.. See the<br />

136<br />

206 * "unnecessary" pointer comparison.<br />

207 */<br />

208 #define min(x,y) ({ \<br />

209 type<strong>of</strong>(x) _x = (x); \<br />

210 type<strong>of</strong>(y) _y = (y); \<br />

211 (void) (&_x == &_y); \<br />

212 _x < _y ? _x : _y; })<br />

213<br />

214 #define max(x,y) ({ \<br />

215 type<strong>of</strong>(x) _x = (x); \<br />

216 type<strong>of</strong>(y) _y = (y); \

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

Saved successfully!

Ooh no, something went wrong!