上面的ufshcd_prepare_lrb能展开吗?
时间: 2024-03-02 14:54:17 浏览: 104
当然可以展开,ufshcd_prepare_lrb函数是用于填充命令请求块的,其源代码如下所示:
```c
static void ufshcd_prepare_lrb(struct ufshcd_lrb *lrb, struct ufs_cmd *cmd,
struct ufshcd_host *host)
{
struct ufs_dev_cmd *dev_cmd = &cmd->dev_cmd;
/* 填充命令请求块 */
lrb->cmd = cmd;
lrb->tag = cmd->tag;
lrb->sense_buffer = cmd->sense_buffer;
lrb->sense_buffer_dma = cmd->sense_buffer_dma;
lrb->ucd = cmd->ucd;
lrb->ucd_dma = cmd->ucd_dma;
lrb->data_dir = cmd->data_dir;
lrb->data_sg = cmd->data_sg;
lrb->n_data_sg = cmd->n_data_sg;
lrb->data_buffer = cmd->data_buffer;
lrb->data_dma = cmd->data_dma;
lrb->residue_sg = cmd->residue_sg;
lrb->residue_ptr = cmd->residue_ptr;
lrb->residue_len = cmd->residue_len;
lrb->status = 0;
lrb->state = UFS_LRB_STATE_PENDING;
lrb->t_completed = 0;
lrb->done = cmd->done;
lrb->host = host;
lrb->xfer_mode = dev_cmd->xfer_mode;
lrb->task_tag = dev_cmd->task_tag;
lrb->cmd_type = dev_cmd->cmd_type;
lrb->cmd_set_type = dev_cmd->cmd_set_type;
lrb->dev_lun = dev_cmd->dev_lun;
lrb->data_len = dev_cmd->data_len;
lrb->cmd_len = dev_cmd->cmd_len;
lrb->cmd_data = dev_cmd->cmd_data;
lrb->resp_len = dev_cmd->resp_len;
lrb->resp_data = dev_cmd->resp_data;
}
```
该函数将UFS命令相关的各种数据填充到命令请求块中,以便在将命令添加到命令队列中时使用。其中,lrb表示命令请求块,cmd表示UFS命令,host表示UFS主机控制器。
具体来说,该函数将命令请求块的cmd字段设置为UFS命令,将tag字段设置为UFS命令的标签,将sense_buffer和sense_buffer_dma分别设置为UFS命令的感知缓冲区和感知缓冲区的DMA地址,将ucd和ucd_dma分别设置为UFS命令的UCD缓冲区和UCD缓冲区的DMA地址,将data_dir、data_sg、n_data_sg、data_buffer和data_dma分别设置为UFS命令的数据方向、数据段、数据段数量、数据缓冲区和数据缓冲区的DMA地址等。
此外,该函数还将命令请求块的其他字段设置为一些默认值,如状态为UFS_LRB_STATE_PENDING,完成时间为0,状态为0等。
总之,ufshcd_prepare_lrb函数的作用是将UFS命令填充到命令请求块中,以便在将命令添加到命令队列中时使用。
阅读全文