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.

1006 size_t bytes;<br />

1007<br />

1008 /*<br />

1009 * members below are private to usbcore,<br />

1010 * and are not provided for driver access!<br />

1011 */<br />

1012 spinlock_t lock;<br />

1013<br />

1014 struct usb_device *dev;<br />

1015 int pipe;<br />

1016 struct scatterlist *sg;<br />

1017 int nents;<br />

1018<br />

1019 int entries;<br />

1020 struct urb **urbs;<br />

1021<br />

1022 int count;<br />

1023 struct completion complete;<br />

1024 };<br />

整个usb 系统都会使用这个数据结构,如果我们希望使用scatter gather 方式的话.usb core 已经为<br />

我们准备好了数据结构和相应的函数,我们只需要调用即可.一共有三个函数,她们是<br />

usb_sg_init,usb_sg_wait,usb_sg_cancel.我们要提交一个sg 请求,需要做的是,先用usb_sg_init 来<br />

初始化请求,然后usb_sg_wait()正式提交,然后我们该做的就都做了.如果想撤销一个sg 请求,那么调用<br />

usb_sg_cancel 即可.<br />

咱们虽说不用仔细去看着三个函数内部是如何实现的,但至少得知道该传递什么参数吧.不妨来仔细看一<br />

下usb_sg_init()被调用时传递给她的参数.头一个刚才已经说了,就是sg request,第二个,需要告诉她是<br />

哪个usb设备要发送或接收数据,咱们给她传递的是us->pusb_dev,第三个,是哪个pipe,这个没什么好说<br />

的,pipe 是上面一路传下来的.第四个参数,这是专门适用于中断传输的,被传输中断端点的轮询率,对于<br />

165<br />

bulk 传输,直接忽略,所以咱们传递了0.第五个和第六个参数就分别是sg 数组和sg 数组中元素的个数.然<br />

后第七个参数,length,传递的就是咱们希望传输的数据长度,最后一个是SLAB flag,内存申请相关的一个<br />

flag.如果驱动程序处于block I/O 路径中应该使用GFP_NOIO,咱们这里SLAB_NOIO 实际上是一个宏,<br />

实际上就是GFP_NOIO.不要问我为什么用SLAB_NOIO 或者说GFP_NOIO,无可奉告.(如果你真的想知<br />

道为什么的话,回去看当初我们是如何调用usb_submit_urb()的,理由当时就已经讲过了.)这个函数成功<br />

返回值为0,否则返回负的错误码.初始化好了之后就可以为us->flags 设置US_FLIDX_SG_ACTIVE 了,<br />

对这个flag 陌生吗?还是回去看usb_submit_urb(),当时我们也为urb 设置了这么一个<br />

flag,US_FLDX_URB_ACTIVE,其实历史总是惊人的相似.当初我们对待urb 的方式和如今对待sg<br />

request 的方式几乎一样.所以其实是很好理解的.<br />

对比一下当初调用usb_submit_urb()的代码,就会发现464 到471 这一段我们不会陌生,当年咱们提<br />

交urb 之前就有这么一段,usb_stor_msg_common()函数中,只不过那时候是urb 而不是sg,这两段代<br />

码之间何其的相似!只是年年岁岁花相似,岁岁年年人不同啊!然后474 行,usb_sg_wait()函数得到调用.<br />

她所需要的参数就是sg request 的地址,咱们传递了us->current_sg 的地址给她.这个函数结<br />

束,US_FLIDX_SG_ACTIVE 这个flag 就可以clear 掉了.返回值被保存在us->current_sg.status<br />

中,

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

Saved successfully!

Ooh no, something went wrong!