学习经验:第一步是查看驱动程序的所有头部文件和学习对象的成员结构。看看核源代码是如何设计的。让我们从一个例子中得出推论,学习并应用于我们自己编写的核代码驱动。
(1)相关头文件、涉及的对象和枚举
/drivers/scsi/pm8001/pm8001_hwi.h /drivers/scsi/pm8001/pm8001_defs.h /drivers/scsi/pm8001/pm80xx_hwi.h /drivers/scsi/pm8001/pm8001_sas.h
/drivers/scsi/pm8001/pm8001_hwi.h
@||- struct @||| mpi_msg_hdr @||| phy_start_req @||| phy_stop_req @||| set_dev_bits_fis @||| pio_setup_fis @||| sata_completion_resp @||| hw_event_resp @||| reg_dev_req @||| dereg_dev_req @||| dev_reg_resp @||| local_phy_ctl_req @||| local_phy_ctl_resp @||| port_ctl_req @||| hw_event_ack_req @||| ssp_completion_resp @||| sata_event_resp @||| ssp_event_resp @||| general_event_resp @||| smp_req @||| smp_completion_resp @||| task_abort_req @||| task_abort_resp @||| sas_diag_start_end_req @||| sas_diag_execute_req @||| set_dev_state_req @||| sas_re_initialization_req @||| sata_start_req @||| ssp_ini_tm_start_req @||| ssp_info_unit @||| ssp_ini_io_start_req @||| fw_flash_Update_req @||| fw_flash_Update_resp @||| get_nvm_data_req @||| set_nvm_data_req @||| get_nvm_data_resp @||| sas_diag_start_end_resp @||| sas_diag_execute_resp @||| set_dev_state_resp /drivers/scsi/pm8001/pm80xx_hwi.h
@||- struct @||| mpi_msg_hdr @||| phy_start_req @||| phy_stop_req @||| set_dev_bits_fis @||| pio_setup_fis @||| sata_completion_resp @||| hw_event_resp @||| thermal_hw_event @||| reg_dev_req @||| dereg_dev_req @||| dev_reg_resp @||| local_phy_ctl_req @||| local_phy_ctl_resp @||| port_ctl_req @||| hw_event_ack_req @||| phy_start_resp @||| phy_stop_resp @||| ssp_completion_resp @||| sata_event_resp @||| ssp_event_resp @||| general_event_resp @||| smp_req @||| smp_completion_resp @||| task_abort_req @||| task_abort_resp @||| sas_diag_start_end_req @||| sas_diag_execute_req @||| set_dev_state_req @||| sata_start_req @||| ssp_ini_tm_start_req @||| ssp_info_unit @||| ssp_ini_io_start_req @||| ssp_dif_enc_io_req @||| fw_flash_Update_req @||| fw_flash_Update_resp @||| get_nvm_data_req @||| set_nvm_data_req @||| set_ctrl_cfg_req @||| get_ctrl_cfg_req @||| kek_mgmt_req @||| dek_mgmt_req @||| set_phy_profile_req @||| get_phy_profile_req @||| ext_flash_partition_req @||| get_nvm_data_resp @||| sas_diag_start_end_resp @||| sas_diag_execute_resp @||| set_dev_state_resp @||| set_ctrl_cfg_resp @||| get_ctrl_cfg_resp @||| kek_mgmt_resp @||| dek_mgmt_resp @||| get_phy_profile_resp @||| flash_op_ext_resp @||| set_phy_profile_resp @||| ssp_coalesced_comp_resp @||| SASProtocolTimerConfig /drivers/scsi/pm8001/pm8001_defs.h
@||- enum @||| chip_flavors @||| phy_speed @||| data_direction @||| port_type @||| memory_region_num @||| mpi_err @||| phy_control_type @||| pm8001_hba_info_flags /drivers/scsi/pm8001/pm8001_sas.h
@||- struct @||| pm8001_tmf_task @||| pm8001_ioctl_payload @||| pm8001_dispatch @||| pm8001_chip_info @||| pm8001_port @||| pm8001_phy @||| pm801_device
@||| pm8001_prd_imt
@||| pm8001_prd
@||| pm8001_ccb_info
@||| mpi_mem
@||| mpi_mem_req
@||| encrypt
@||| sas_phy_attribute_table
@||| inbound_queue_table
@||| outbound_queue_table
@||| pm8001_hba_memspace
@||| pm8001_hba_info
@||| pm8001_work
@||| pm8001_fw_image_header
@||| fw_flash_updata_info
@||| fw_control_info
@||| fw_control_ex