Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1959586
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 服务器与存储

2015-03-20 10:55:25

前言

PM8001驱动是linux内核自带的开源SAS HBA驱动,有关SAS协议相关内容可以到上看标准文档,这里不做介绍;HBA相关介绍请自行百度。由于本人刚刚接触这个行业,之前也未从事过驱动开发,所以从一个初学者的角度谈一下对PM8001驱动的理解,如有不足之处欢迎各种意见和建议以及探讨。第一次写博客正式开始....

1.介绍

PM8001是PMC公司的一款SAS/SATA 6Gbits/s 8端口芯片,能支持1.5G/3G/6Gbit设备,支持SSP/STP/SMP,支持1024个SAS地址....

PM8001驱动属于SCSI子系统三层架构中的Lower level,直接负责和HBA通信,并包含一些最基本的逻辑功能。由于SCSI子系统设计上的特点,虽然其划分了层次并有明确的分层架构设计特点,但这里的Mid level实际上承担的是通常意义上Midware的角色。Mid level本身逻辑有点复杂,并且分别和Upper level | Lower level之间有着比较强的耦合。但这种设计也的确真正做到了将Upper level与Lower level的耦合解开。

2.结构

PM8001驱动在linux kernel的driver/scsi/pm8001/*路径中,里面有9个源文件,本文重点介绍最为关键的几个.c文件:pm8001_init、pm8001_sas、pm8001_hwi、pm8001_ctl.c

pm8001_init

        划分了层次并有明确的分层架构设计特点,但故名思议其中的代码主要负责一些初始化动作。由于PM8001通过PCI总线接入主机,所以这个文件中也重点包含了PCI子系统相关的内容。作为linux模块入口,pm8001_init()函数负责对Mid level层数据结构的部分初始化并完成向pci子系统注册驱动的动作。

        如果有兴趣了解详细初始化步骤,需要重点关注其中的pm8001_pci_probe函数。这个函数是pm8001驱动真正的起点,其中PCI子系统相关操作这里不做介绍,有兴趣的同学可以自行查阅资料。之所以称其为起点,是因为这个函数不仅包括了核心数据结构初始化、注册中断,同时也在这里对芯片进行初始化动作,并在最后发起对SCSI总线的扫描,从而引发了后续一系列流程。其中核心数据结构将在之后的几篇博客中重点介绍。

pm8001_sas

        顾名思义,这个源文件中包含的函数可以理解为是仅略高于底层基础通信的逻辑函数。其中封装了如IT Nexus复位、lun复位、task abort等基础逻辑,也有task tag管理系列函数、ccb管理系列函数等涉及到PM8001芯片机制的管理工具函数(PM8001的命令和通信机制将在后面的文章中介绍)。

pm8001_hwi

        这个文件是几个源文件中最为庞大的一个,但其实却是结构最清楚的一个。其主要包含了与pm8001进行通信的函数。PM8001的中断被捕获后会排入tasklet(下半部)然后利用pm8001_hwi中的函数进行处理。反过来上层也是利用这个文件中的函数实现命令下发。这里需要提一下pm8001_8001_dispatch 结构体,这个结构体是底层通信的总接口,一般由PM8001_CHIP_DISP->*来进行调用(#define PM8001_CHIP_DISP (pm8001_ha->chip->dispatch)  你懂的....)。这个结构体作为全局结构在pm8001_hwi.c末端定义,其中的接口函数是理清PM8001功能和流程的重中之重。

pm8001_ctl

       这个文件中的函数与流程无关,定义了很多DEVICE_ATTR接口,是调试的好帮手,驱动程序员的爱....


总结

        第一次写博客,希望把自己最近学到的一些东西和大家分享,同时也希望能有前辈或同行能够指出其中的错误和不足。时间有限,先扯到这里,后面几天会尽量在加班之余做好更新工作的....


阅读(2288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~