sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget /scsi/libsasmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/zh_TW/scsi/libsasmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/it_IT/scsi/libsasmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ja_JP/scsi/libsasmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ko_KR/scsi/libsasmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/sp_SP/scsi/libsasmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhL/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/scsi/libsas.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(hDocumentation/scsi/libsas.rst h]h)}(hDocumentation/scsi/libsas.rsth]hDocumentation/scsi/libsas.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h3张钰杰 Yujie Zhang h]h)}(h2张钰杰 Yujie Zhang h](h张钰杰 Yujie Zhang <}(hj hhhNhNubh reference)}(hyjzhang@leap-io-kernel.comh]hyjzhang@leap-io-kernel.com}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:yjzhang@leap-io-kernel.comuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]uh1hhjPubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(hSAS 层h]hSAS 层}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjxhhhhhKubh)}(hXSAS 层是一个管理基础架构,用于管理 SAS LLDD。它位于 SCSI Core 与 SAS LLDD 之间。 体系结构如下: SCSI Core 关注的是 SAM/SPC 相 关的问题;SAS LLDD 及其序列控制器负责 PHY 层、OOB 信号以及链路 管理;而 SAS 层则负责以下任务::h]hXSAS 层是一个管理基础架构,用于管理 SAS LLDD。它位于 SCSI Core 与 SAS LLDD 之间。 体系结构如下: SCSI Core 关注的是 SAM/SPC 相 关的问题;SAS LLDD 及其序列控制器负责 PHY 层、OOB 信号以及链路 管理;而 SAS 层则负责以下任务:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubh literal_block)}(hX* SAS Phy、Port 和主机适配器(HA)事件管理(事件由 LLDD 生成,由 SAS 层处理); * SAS 端口的管理(创建与销毁); * SAS 域的发现与重新验证; * SAS 域内设备的管理; * SCSI 主机的注册与注销; * 将设备注册到 SCSI Core(SAS 设备)或 libata(SATA 设备); * 扩展器的管理,并向用户空间导出扩展器控制接口。h]hX* SAS Phy、Port 和主机适配器(HA)事件管理(事件由 LLDD 生成,由 SAS 层处理); * SAS 端口的管理(创建与销毁); * SAS 域的发现与重新验证; * SAS 域内设备的管理; * SCSI 主机的注册与注销; * 将设备注册到 SCSI Core(SAS 设备)或 libata(SATA 设备); * 扩展器的管理,并向用户空间导出扩展器控制接口。}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjxhhubh)}(hSAS LLDD 是一种 PCI 设备驱动程序。它负责 PHY 层和 OOB(带外) 信号的管理、厂商特定的任务,并向 SAS 层上报事件。h]hSAS LLDD 是一种 PCI 设备驱动程序。它负责 PHY 层和 OOB(带外) 信号的管理、厂商特定的任务,并向 SAS 层上报事件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubh)}(hBSAS 层实现了 SAS 1.1 规范中定义的大部分 SAS 功能。h]hBSAS 层实现了 SAS 1.1 规范中定义的大部分 SAS 功能。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjxhhubh)}(hsas_ha_struct 结构体用于向 SAS 层描述一个 SAS LLDD。该结构的 大部分字段由 SAS 层使用,但其中少数字段需要由 LLDD 进行初始化。h]hsas_ha_struct 结构体用于向 SAS 层描述一个 SAS LLDD。该结构的 大部分字段由 SAS 层使用,但其中少数字段需要由 LLDD 进行初始化。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjxhhubh)}(hX在完成硬件初始化之后,应当在驱动的 probe() 函数中调用 sas_register_ha()。该函数会将 LLDD 注册到 SCSI 子系统中,创 建一个对应的 SCSI 主机,并将你的 SAS 驱动程序注册到其在 sysfs 下创建的 SAS 设备树中。随后该函数将返回。接着,你需要使能 PHY, 以启动实际的 OOB(带外)过程;此时驱动将开始调用 notify_* 系 列事件回调函数。h]hX在完成硬件初始化之后,应当在驱动的 probe() 函数中调用 sas_register_ha()。该函数会将 LLDD 注册到 SCSI 子系统中,创 建一个对应的 SCSI 主机,并将你的 SAS 驱动程序注册到其在 sysfs 下创建的 SAS 设备树中。随后该函数将返回。接着,你需要使能 PHY, 以启动实际的 OOB(带外)过程;此时驱动将开始调用 notify_* 系 列事件回调函数。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjxhhubjw)}(hhh](j|)}(h结构体说明h]h结构体说明}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjhhhhhK.ubjw)}(hhh](j|)}(h``struct sas_phy``h]hliteral)}(hjh]hstruct sas_phy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j{hjhhhhhK1ubh)}(hf通常情况下,该结构体会被静态地嵌入到驱动自身定义的 PHY 结构体中, 例如::h]he通常情况下,该结构体会被静态地嵌入到驱动自身定义的 PHY 结构体中, 例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubj)}(hMstruct my_phy { blah; struct sas_phy sas_phy; bleh; }h]hMstruct my_phy { blah; struct sas_phy sas_phy; bleh; }}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK6hjhhubh)}(h随后,在主机适配器(HA)的结构体中,所有的 PHY 通常以 my_phy 数组的形式存在(如下文所示)。h]h随后,在主机适配器(HA)的结构体中,所有的 PHY 通常以 my_phy 数组的形式存在(如下文所示)。}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKsas_ha.sas_addr = &my_ha->sas_addr[0]; for (i = 0; i < MAX_PHYS; i++) { sas_phys[i] = &my_ha->phys[i].sas_phy; sas_ports[i] = &my_ha->sas_ports[i]; } my_ha->sas_ha.sas_phy = sas_phys; my_ha->sas_ha.sas_port = sas_ports; my_ha->sas_ha.num_phys = MAX_PHYS; my_ha->sas_ha.lldd_port_formed = my_port_formed; my_ha->sas_ha.lldd_dev_found = my_dev_found; my_ha->sas_ha.lldd_dev_gone = my_dev_gone; my_ha->sas_ha.lldd_execute_task = my_execute_task; my_ha->sas_ha.lldd_abort_task = my_abort_task; my_ha->sas_ha.lldd_abort_task_set = my_abort_task_set; my_ha->sas_ha.lldd_clear_task_set = my_clear_task_set; my_ha->sas_ha.lldd_I_T_nexus_reset= NULL; (2) my_ha->sas_ha.lldd_lu_reset = my_lu_reset; my_ha->sas_ha.lldd_query_task = my_query_task; my_ha->sas_ha.lldd_clear_nexus_port = my_clear_nexus_port; my_ha->sas_ha.lldd_clear_nexus_ha = my_clear_nexus_ha; my_ha->sas_ha.lldd_control_phy = my_control_phy; return sas_register_ha(&my_ha->sas_ha); }h]hX<static int register_sas_ha(struct my_sas_ha *my_ha) { int i; static struct sas_phy *sas_phys[MAX_PHYS]; static struct sas_port *sas_ports[MAX_PHYS]; my_ha->sas_ha.sas_addr = &my_ha->sas_addr[0]; for (i = 0; i < MAX_PHYS; i++) { sas_phys[i] = &my_ha->phys[i].sas_phy; sas_ports[i] = &my_ha->sas_ports[i]; } my_ha->sas_ha.sas_phy = sas_phys; my_ha->sas_ha.sas_port = sas_ports; my_ha->sas_ha.num_phys = MAX_PHYS; my_ha->sas_ha.lldd_port_formed = my_port_formed; my_ha->sas_ha.lldd_dev_found = my_dev_found; my_ha->sas_ha.lldd_dev_gone = my_dev_gone; my_ha->sas_ha.lldd_execute_task = my_execute_task; my_ha->sas_ha.lldd_abort_task = my_abort_task; my_ha->sas_ha.lldd_abort_task_set = my_abort_task_set; my_ha->sas_ha.lldd_clear_task_set = my_clear_task_set; my_ha->sas_ha.lldd_I_T_nexus_reset= NULL; (2) my_ha->sas_ha.lldd_lu_reset = my_lu_reset; my_ha->sas_ha.lldd_query_task = my_query_task; my_ha->sas_ha.lldd_clear_nexus_port = my_clear_nexus_port; my_ha->sas_ha.lldd_clear_nexus_ha = my_clear_nexus_ha; my_ha->sas_ha.lldd_control_phy = my_control_phy; return sas_register_ha(&my_ha->sas_ha); }}hj5sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubhenumerated_list)}(hhh]j)}(hASAS 1.1 未定义 I_T Nexus Reset TMF(任务管理功能)。 h]h)}(h@SAS 1.1 未定义 I_T Nexus Reset TMF(任务管理功能)。h]h@SAS 1.1 未定义 I_T Nexus Reset TMF(任务管理功能)。}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjHubah}(h]h ]h"]h$]h&]uh1jhjEhhhhhNubah}(h]h ]h"]h$]h&]enumtypearabicprefix(suffix)startKuh1jChjhhhhhMubeh}(h]sas-portah ]h"]sas_portah$]h&]uh1jvhjhhhhhKubeh}(h]struct-sas-ha-structah ]h"]struct sas_ha_structah$]h&]uh1jvhjhhhhhKubeh}(h]id1ah ]h"]结构体说明ah$]h&]uh1jvhjxhhhhhK.ubjw)}(hhh](j|)}(h事件h]h事件}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjhhhhhM ubh)}(h事件是 SAS LLDD 唯一的通知 SAS 层发生任何情况的方式。 LLDD 没有其他方法可以告知 SAS 层其内部或 SAS 域中发生的事件。h]h事件是 SAS LLDD 唯一的通知 SAS 层发生任何情况的方式。 LLDD 没有其他方法可以告知 SAS 层其内部或 SAS 域中发生的事件。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubh)}(h Phy 事件::h]h Phy 事件:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hRPHYE_LOSS_OF_SIGNAL, (C) PHYE_OOB_DONE, PHYE_OOB_ERROR, (C) PHYE_SPINUP_HOLD.h]hRPHYE_LOSS_OF_SIGNAL, (C) PHYE_OOB_DONE, PHYE_OOB_ERROR, (C) PHYE_SPINUP_HOLD.}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhMhjhhubh)}(h$端口事件,通过 _phy_ 传递::h]h#端口事件,通过 _phy_ 传递:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hPORTE_BYTES_DMAED, (M) PORTE_BROADCAST_RCVD, (E) PORTE_LINK_RESET_ERR, (C) PORTE_TIMER_EVENT, (C) PORTE_HARD_RESET.h]hPORTE_BYTES_DMAED, (M) PORTE_BROADCAST_RCVD, (E) PORTE_LINK_RESET_ERR, (C) PORTE_TIMER_EVENT, (C) PORTE_HARD_RESET.}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhMhjhhubjc)}(hhh]jh)}(h#主机适配器事件: HAE_RESET h](jn)}(h主机适配器事件:h]h主机适配器事件:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhMhjubj~)}(hhh]h)}(h HAE_RESETh]h HAE_RESET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j}hjubeh}(h]h ]h"]h$]h&]uh1jghhhMhjubah}(h]h ]h"]h$]h&]uh1jbhjhhhhhNubh)}(h&SAS LLDD 应能够生成以下事件::h]h%SAS LLDD 应能够生成以下事件:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubj)}(hX2 - 来自 C 组的至少一个事件(可选), - 标记为 M(必需)的事件为必需事件(至少一种); - 若希望 SAS 层处理域重新验证(domain revalidation),则 应生成标记为 E(扩展器)的事件(仅需一种); - 未标记的事件为可选事件。h]hX2 - 来自 C 组的至少一个事件(可选), - 标记为 M(必需)的事件为必需事件(至少一种); - 若希望 SAS 层处理域重新验证(domain revalidation),则 应生成标记为 E(扩展器)的事件(仅需一种); - 未标记的事件为可选事件。}hj" sbah}(h]h ]h"]h$]h&]hhuh1jhhhM"hjhhubh)}(h含义h]h含义}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM(hjhhubjc)}(hhh](jh)}(h8HAE_RESET - 当 HA 发生内部错误并被复位时。 h](jn)}(h HAE_RESETh]h HAE_RESET}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM+hjA ubj~)}(hhh]j)}(hhh]j)}(h,当 HA 发生内部错误并被复位时。 h]h)}(h+当 HA 发生内部错误并被复位时。h]h+当 HA 发生内部错误并被复位时。}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjY ubah}(h]h ]h"]h$]h&]uh1jhjV ubah}(h]h ]h"]h$]h&]jjuh1jhhhM+hjS ubah}(h]h ]h"]h$]h&]uh1j}hjA ubeh}(h]h ]h"]h$]h&]uh1jghhhM+hj> ubjh)}(h8PORTE_BYTES_DMAED - 在接收到 IDENTIFY/FIS 帧时。 h](jn)}(hPORTE_BYTES_DMAEDh]hPORTE_BYTES_DMAED}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM.hj ubj~)}(hhh]j)}(hhh]j)}(h$在接收到 IDENTIFY/FIS 帧时。 h]h)}(h#在接收到 IDENTIFY/FIS 帧时。h]h#在接收到 IDENTIFY/FIS 帧时。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhM.hj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhM.hj> hhubjh)}(h6PORTE_BROADCAST_RCVD - 在接收到一个原语时。 h](jn)}(hPORTE_BROADCAST_RCVDh]hPORTE_BROADCAST_RCVD}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM1hj ubj~)}(hhh]j)}(hhh]j)}(h在接收到一个原语时。 h]h)}(h在接收到一个原语时。h]h在接收到一个原语时。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM1hj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhM1hj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhM1hj> hhubjh)}(hUPORTE_LINK_RESET_ERR - 定时器超时、信号丢失、丢失 DWS 等情况。 [1]_ h](jn)}(hPORTE_LINK_RESET_ERRh]hPORTE_LINK_RESET_ERR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM4hj ubj~)}(hhh]j)}(hhh]j)}(h>定时器超时、信号丢失、丢失 DWS 等情况。 [1]_ h]h)}(h=定时器超时、信号丢失、丢失 DWS 等情况。 [1]_h](h9定时器超时、信号丢失、丢失 DWS 等情况。 }(hj# hhhNhNubhfootnote_reference)}(h[1]_h]h1}(hj- hhhNhNubah}(h]id3ah ]h"]h$]h&]refidid7docnametranslations/zh_CN/scsi/libsasuh1j+ hj# resolvedKubeh}(h]h ]h"]h$]h&]uh1hhhhM4hj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhM4hj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhM4hj> hhubjh)}(h>PORTE_TIMER_EVENT - DWS 复位超时定时器到期时。[1]_ h](jn)}(hPORTE_TIMER_EVENTh]hPORTE_TIMER_EVENT}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM7hj_ ubj~)}(hhh]j)}(hhh]j)}(h*DWS 复位超时定时器到期时。[1]_ h]h)}(h)DWS 复位超时定时器到期时。[1]_h](h%DWS 复位超时定时器到期时。}(hj{ hhhNhNubj, )}(h[1]_h]h1}(hj hhhNhNubah}(h]id4ah ]h"]h$]h&]j< j= j> j? uh1j+ hj{ j@ Kubeh}(h]h ]h"]h$]h&]uh1hhhhM7hjw ubah}(h]h ]h"]h$]h&]uh1jhjt ubah}(h]h ]h"]h$]h&]jjuh1jhhhM7hjq ubah}(h]h ]h"]h$]h&]uh1j}hj_ ubeh}(h]h ]h"]h$]h&]uh1jghhhM7hj> hhubjh)}(h/PORTE_HARD_RESET - 收到 Hard Reset 原语。 h](jn)}(hPORTE_HARD_RESETh]hPORTE_HARD_RESET}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM:hj ubj~)}(hhh]j)}(hhh]j)}(h收到 Hard Reset 原语。 h]h)}(h收到 Hard Reset 原语。h]h收到 Hard Reset 原语。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhM:hj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhM:hj> hhubjh)}(h4PHYE_LOSS_OF_SIGNAL - 设备已断开连接。 [1]_ h](jn)}(hPHYE_LOSS_OF_SIGNALh]hPHYE_LOSS_OF_SIGNAL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhM=hj ubj~)}(hhh]j)}(hhh]j)}(h设备已断开连接。 [1]_ h]h)}(h设备已断开连接。 [1]_h](h设备已断开连接。 }(hj hhhNhNubj, )}(h[1]_h]h1}(hj hhhNhNubah}(h]id5ah ]h"]h$]h&]j< j= j> j? uh1j+ hj j@ Kubeh}(h]h ]h"]h$]h&]uh1hhhhM=hj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhM=hj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhM=hj> hhubjh)}(h hhubjh)}(hRPHYE_OOB_ERROR - 执行 OOB 过程中出现错误,设备可能已断开。 [1]_ h](jn)}(hPHYE_OOB_ERRORh]hPHYE_OOB_ERROR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhMChj ubj~)}(hhh]j)}(hhh]j)}(hA执行 OOB 过程中出现错误,设备可能已断开。 [1]_ h]h)}(h@执行 OOB 过程中出现错误,设备可能已断开。 [1]_h](h<执行 OOB 过程中出现错误,设备可能已断开。 }(hj hhhNhNubj, )}(h[1]_h]h1}(hj hhhNhNubah}(h]id6ah ]h"]h$]h&]j< j= j> j? uh1j+ hj j@ Kubeh}(h]h ]h"]h$]h&]uh1hhhhMChj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhMChj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhMChj> hhubjh)}(hJPHYE_SPINUP_HOLD - 检测到 SATA 设备,但未发送 COMWAKE 信号。 h](jn)}(hPHYE_SPINUP_HOLDh]hPHYE_SPINUP_HOLD}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jmhhhMFhj ubj~)}(hhh]j)}(hhh]j)}(h7检测到 SATA 设备,但未发送 COMWAKE 信号。 h]h)}(h6检测到 SATA 设备,但未发送 COMWAKE 信号。h]h6检测到 SATA 设备,但未发送 COMWAKE 信号。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMFhj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]jjuh1jhhhMFhj ubah}(h]h ]h"]h$]h&]uh1j}hj ubeh}(h]h ]h"]h$]h&]uh1jghhhMFhj> hhubeh}(h]h ]h"]h$]h&]uh1jbhjhhhNhNubhfootnote)}(h应设置或清除 phy 中相应的字段,或者从 tasklet 中调用 内联函数 sas_phy_disconnected(),该函数只是一个辅助函数。 h](hlabel)}(h1h]h1}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1j$ hj ubh)}(h应设置或清除 phy 中相应的字段,或者从 tasklet 中调用 内联函数 sas_phy_disconnected(),该函数只是一个辅助函数。h]h应设置或清除 phy 中相应的字段,或者从 tasklet 中调用 内联函数 sas_phy_disconnected(),该函数只是一个辅助函数。}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhj ubeh}(h]j= ah ]h"]1ah$]h&](j7 j j j ej> j? uh1j hhhMHhjhhj@ Kubh)}(h执行命令 SCSI RPC::h]h执行命令 SCSI RPC:}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhjhhubj)}(h=int (*lldd_execute_task)(struct sas_task *, gfp_t gfp_flags);h]h=int (*lldd_execute_task)(struct sas_task *, gfp_t gfp_flags);}hjW sbah}(h]h ]h"]h$]h&]hhuh1jhhhMMhjhhubh)}(h~用于将任务排队提交给 SAS LLDD,@task 为要执行的任务,@gfp_mask 为定义调用者上下文的 gfp 掩码。h]h~用于将任务排队提交给 SAS LLDD,@task 为要执行的任务,@gfp_mask 为定义调用者上下文的 gfp 掩码。}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhjhhubh)}(h,此函数应实现 执行 SCSI RPC 命令。h]h,此函数应实现 执行 SCSI RPC 命令。}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhjhhubh)}(h也就是说,当调用 lldd_execute_task() 时,命令应当立即在传输 层发出。SAS LLDD 中在任何层级上都不应再进行队列排放。h]h也就是说,当调用 lldd_execute_task() 时,命令应当立即在传输 层发出。SAS LLDD 中在任何层级上都不应再进行队列排放。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThjhhubh)}(h 返回值::h]h 返回值:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhjhhubj)}(hm* 返回 -SAS_QUEUE_FULL 或 -ENOMEM 表示未排入队列; * 返回 0 表示任务已成功排入队列。h]hm* 返回 -SAS_QUEUE_FULL 或 -ENOMEM 表示未排入队列; * 返回 0 表示任务已成功排入队列。}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhMYhjhhubj)}(hXstruct sas_task { dev —— 此任务目标设备; task_proto —— 协议类型,为 enum sas_proto 中的一种; scatter —— 指向散布/聚集(SG)列表数组的指针; num_scatter —— SG 列表元素数量; total_xfer_len —— 预计传输的总字节数; data_dir —— 数据传输方向(PCI_DMA_*); task_done —— 任务执行完成时的回调函数。 };h]hXstruct sas_task { dev —— 此任务目标设备; task_proto —— 协议类型,为 enum sas_proto 中的一种; scatter —— 指向散布/聚集(SG)列表数组的指针; num_scatter —— SG 列表元素数量; total_xfer_len —— 预计传输的总字节数; data_dir —— 数据传输方向(PCI_DMA_*); task_done —— 任务执行完成时的回调函数。 };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhM^hjhhubeh}(h]id2ah ]h"]事件ah$]h&]uh1jvhjxhhhhhM ubjw)}(hhh](j|)}(h发现h]h发现}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hj hhhhhMiubh)}(hsysfs 树有以下用途::h]hsysfs 树有以下用途:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhj hhubj)}(ha) 它显示当前时刻 SAS 域的物理布局,即展示当前物理世界中 域的实际结构。 b) 显示某些设备的参数。 _at_discovery_time_.h]ha) 它显示当前时刻 SAS 域的物理布局,即展示当前物理世界中 域的实际结构。 b) 显示某些设备的参数。 _at_discovery_time_.}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhMmhj hhubh)}(h下面是一个指向 tree(1) 程序的链接,该工具在查看 SAS 域时非常 有用: ftp://mama.indstate.edu/linux/tree/h](h^下面是一个指向 tree(1) 程序的链接,该工具在查看 SAS 域时非常 有用: }(hj hhhNhNubj))}(h#ftp://mama.indstate.edu/linux/tree/h]h#ftp://mama.indstate.edu/linux/tree/}(hj hhhNhNubah}(h]h ]h"]h$]h&]refurij uh1j(hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMqhj hhubh)}(hQ我期望用户空间的应用程序最终能够为此创建一个图形界面。h]hQ我期望用户空间的应用程序最终能够为此创建一个图形界面。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMuhj hhubh)}(h也就是说,sysfs 域树不会显示或保存某些状态变化,例如,如果你更 改了 READY LED 含义的设置,sysfs 树不会反映这种状态变化;但它 确实会显示域设备的当前连接状态。h]h也就是说,sysfs 域树不会显示或保存某些状态变化,例如,如果你更 改了 READY LED 含义的设置,sysfs 树不会反映这种状态变化;但它 确实会显示域设备的当前连接状态。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMwhj hhubh)}(h]维护内部设备状态变化的职责由上层(命令集驱动)和用户空间负责。h]h]维护内部设备状态变化的职责由上层(命令集驱动)和用户空间负责。}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM{hj hhubh)}(h当某个设备或多个设备从域中拔出时,这一变化会立即反映在 sysfs 树中,并且这些设备会从系统中移除。h]h当某个设备或多个设备从域中拔出时,这一变化会立即反映在 sysfs 树中,并且这些设备会从系统中移除。}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM}hj hhubh)}(hX结构体 domain_device 描述了 SAS 域中的任意设备。它完全由 SAS 层管理。一个任务会指向某个域设备,SAS LLDD 就是通过这种方式知 道任务应发送到何处。SAS LLDD 只读取 domain_device 结构的内容, 但不会创建或销毁它。h]hX结构体 domain_device 描述了 SAS 域中的任意设备。它完全由 SAS 层管理。一个任务会指向某个域设备,SAS LLDD 就是通过这种方式知 道任务应发送到何处。SAS LLDD 只读取 domain_device 结构的内容, 但不会创建或销毁它。}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]id8ah ]h"]发现ah$]h&]uh1jvhjxhhhhhMiubjw)}(hhh](j|)}(h!用户空间中的扩展器管理h]h!用户空间中的扩展器管理}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjY hhhhhMubh)}(hX在 sysfs 中的每个扩展器目录下,都有一个名为 "smp_portal" 的 文件。这是一个二进制的 sysfs 属性文件,它实现了一个 SMP 入口 (注意:这并不是一个 SMP 端口),用户空间程序可以通过它发送 SMP 请求并接收 SMP 响应。h]hX 在 sysfs 中的每个扩展器目录下,都有一个名为 “smp_portal” 的 文件。这是一个二进制的 sysfs 属性文件,它实现了一个 SMP 入口 (注意:这并不是一个 SMP 端口),用户空间程序可以通过它发送 SMP 请求并接收 SMP 响应。}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubh)}(h.该功能的实现方式看起来非常简单:h]h.该功能的实现方式看起来非常简单:}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubjD)}(hhh]j)}(hf构建要发送的 SMP 帧。其格式和布局在 SAS 规范中有说明。保持 CRC 字段为 0。 h]h)}(he构建要发送的 SMP 帧。其格式和布局在 SAS 规范中有说明。保持 CRC 字段为 0。h]he构建要发送的 SMP 帧。其格式和布局在 SAS 规范中有说明。保持 CRC 字段为 0。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jfjgjhhjj.uh1jChjY hhhhhMubh)}(hopen(2)h]hopen(2)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubjD)}(hhh]j)}(h@以读写模式打开该扩展器的 SMP portal sysfs 文件。 h]h)}(h?以读写模式打开该扩展器的 SMP portal sysfs 文件。h]h?以读写模式打开该扩展器的 SMP portal sysfs 文件。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jfjgjhhjjj jlKuh1jChjY hhhhhMubh)}(hwrite(2)h]hwrite(2)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubjD)}(hhh]j)}(h+将第 1 步中构建的帧写入文件。 h]h)}(h*将第 1 步中构建的帧写入文件。h]h*将第 1 步中构建的帧写入文件。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jfjgjhhjjj jlKuh1jChjY hhhhhMubh)}(hread(2)h]hread(2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubjD)}(hhh]j)}(h读取与所构建帧预期返回长度相同的数据量。如果读取的数据量与 预期不符,则表示发生了某种错误。 h]h)}(h读取与所构建帧预期返回长度相同的数据量。如果读取的数据量与 预期不符,则表示发生了某种错误。h]h读取与所构建帧预期返回长度相同的数据量。如果读取的数据量与 预期不符,则表示发生了某种错误。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]jfjgjhhjjj jlKuh1jChjY hhhhhMubh)}(hclose(2)h]hclose(2)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubh)}(hg整个过程在 "expander_conf.c" 文件中的函数 do_smp_func() 及其调用者中有详细展示。h]hk整个过程在 “expander_conf.c” 文件中的函数 do_smp_func() 及其调用者中有详细展示。}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubh)}(h9对应的内核实现位于 "sas_expander.c" 文件中。h]h=对应的内核实现位于 “sas_expander.c” 文件中。}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubh)}(h程序 "expander_conf.c" 实现了上述逻辑。它接收一个参数——扩展器 SMP portal 的 sysfs 文件名,并输出扩展器的信息,包括路由表内容。h]h程序 “expander_conf.c” 实现了上述逻辑。它接收一个参数——扩展器 SMP portal 的 sysfs 文件名,并输出扩展器的信息,包括路由表内容。}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubh)}(hPSMP portal 赋予了你对扩展器的完全控制权,因此请谨慎操作。h]hPSMP portal 赋予了你对扩展器的完全控制权,因此请谨慎操作。}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjY hhubeh}(h]id9ah ]h"]!用户空间中的扩展器管理ah$]h&]uh1jvhjxhhhhhMubeh}(h]sasah ]h"]sas 层ah$]h&]uh1jvhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j{N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files% ]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}1](j- j j j esrefids}nameids}(jjjjjTjQjjjzjwjjjrjoj j jF j= jV jS jj}u nametypes}(jjjTjjzjjrj jF jV juh}(jjxjjjQjjjWjwjjj$jojj jj7 j- j j j j j j j= j jS j j}jY u footnote_refs}j](j- j j j es citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes]j a citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jK sRparse_messages](hsystem_message)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "2" (ordinal 2)h]h>Enumerated list start value not ordinal-1: “2” (ordinal 2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1jhjhhhhhMubj)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "2" (ordinal 2)h]h>Enumerated list start value not ordinal-1: “2” (ordinal 2)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]levelKtypej.sourcehlineKuh1jhjY hhhhhMubj)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "3" (ordinal 3)h]h>Enumerated list start value not ordinal-1: “3” (ordinal 3)}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLubah}(h]h ]h"]h$]h&]levelKtypej.sourcehlineKuh1jhjY hhhhhMubj)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "4" (ordinal 4)h]h>Enumerated list start value not ordinal-1: “4” (ordinal 4)}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgubah}(h]h ]h"]h$]h&]levelKtypej.sourcehlineKuh1jhjY hhhhhMubetransform_messages] transformerN include_log]0Documentation/translations/zh_CN/scsi/libsas.rst(NNNNta decorationNhhub.