Esphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget0/translations/zh_CN/driver-api/tty/tty_internalsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/zh_TW/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/it_IT/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ja_JP/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ko_KR/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/pt_BR/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/sp_SP/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhJ/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals.rsthKubhsection)}(hhh](htitle)}(h TTY Internalsh]h TTY Internals}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h paragraph)}(hhh]h reference)}(hhh]hKopen}(hhhhhNhNubah}(h]id1ah ]h"]h$]h&]refidkopenuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hExported Internal Functions}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidexported-internal-functionsuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hInternal Functions}(hj7hhhNhNubah}(h]id3ah ]h"]h$]h&]refidinternal-functionsuh1hhj4ubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hKopenh]hKopen}(hjfhhhNhNubah}(h]h ]h"]h$]h&]refidhuh1hhjchhhhhK ubh)}(h=These functions serve for opening a TTY from the kernelspace:h]h=These functions serve for opening a TTY from the kernelspace:}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjchhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singletty_kclose (C function) c.tty_kclosehNtauh1jhjchhhNhNubhdesc)}(hhh](hdesc_signature)}(h(void tty_kclose (struct tty_struct *tty)h]hdesc_signature_line)}(h'void tty_kclose(struct tty_struct *tty)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMLubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhMLubh desc_name)}(h tty_kcloseh]h desc_sig_name)}(h tty_kcloseh]h tty_kclose}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhMLubhdesc_parameterlist)}(h(struct tty_struct *tty)h]hdesc_parameter)}(hstruct tty_struct *ttyh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j1 ASTIdentifier)}j,jsb c.tty_kcloseasbuh1hhjubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubhdesc_sig_punctuation)}(h*h]h*}(hjNhhhNhNubah}(h]h ]pah"]h$]h&]uh1jLhjubj)}(httyh]htty}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMLubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhjhMLubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhMLhjhhubh desc_content)}(hhh]h)}(hcloses tty opened by tty_kopenh]hcloses tty opened by tty_kopen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMLhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMLubeh}(h]h ](j*functioneh"]h$]h&]domainj*objtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjchNhNubh container)}(h**Parameters** ``struct tty_struct *tty`` tty device **Description** Performs the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets ``TTY_PORT_KOPENED`` flag on **tty->port**.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMPhjubhdefinition_list)}(hhh]hdefinition_list_item)}(h&``struct tty_struct *tty`` tty device h](hterm)}(h``struct tty_struct *tty``h]hliteral)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMMhjubh definition)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj!h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMOhjubh)}(hPerforms the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets ``TTY_PORT_KOPENED`` flag on **tty->port**.h](h}Performs the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets }(hj7hhhNhNubj)}(h``TTY_PORT_KOPENED``h]hTTY_PORT_KOPENED}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh flag on }(hj7hhhNhNubj)}(h **tty->port**h]h tty->port}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMNhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjchhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j tty_kopen_exclusive (C function)c.tty_kopen_exclusivehNtauh1jhjchhhNhNubj)}(hhh](j)}(h6struct tty_struct * tty_kopen_exclusive (dev_t device)h]j)}(h4struct tty_struct *tty_kopen_exclusive(dev_t device)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,tty_kopen_exclusivesbc.tty_kopen_exclusiveasbuh1hhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjhhhjhMubj)}(htty_kopen_exclusiveh]j)}(hjh]htty_kopen_exclusive}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubj)}(h(dev_t device)h]j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj modnameN classnameNj0j3)}j6]jc.tty_kopen_exclusiveasbuh1hhjubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdeviceh]hdevice}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hopen a tty device for kernelh]hopen a tty device for kernel}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjZhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjujjujjjuh1jhhhjchNhNubj)}(hX**Parameters** ``dev_t device`` dev_t of device to open **Description** Opens tty exclusively for kernel. Performs the driver lookup, makes sure it's not already opened and performs the first-time tty initialization. Claims the global ``tty_mutex`` to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table **Return** the locked initialized :c:type:`tty_struct`h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjyubj)}(hhh]j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hjh]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjyubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjyubh)}(hOpens tty exclusively for kernel. Performs the driver lookup, makes sure it's not already opened and performs the first-time tty initialization.h]hOpens tty exclusively for kernel. Performs the driver lookup, makes sure it’s not already opened and performs the first-time tty initialization.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjyubj)}(hhh]j)}(hClaims the global ``tty_mutex`` to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table h](j)}(h-Claims the global ``tty_mutex`` to serialize:h](hClaims the global }(hjhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to serialize:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hhh](h)}(h(concurrent first-time tty initializationh]h)}(hj.h]h(concurrent first-time tty initialization}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhj,ubah}(h]h ]h"]h$]h&]uh1hhj)ubh)}(h'concurrent tty driver removal w/ lookuph]h)}(hjFh]h'concurrent tty driver removal w/ lookup}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjDubah}(h]h ]h"]h$]h&]uh1hhj)ubh)}(h)concurrent tty removal from driver table h]h)}(h(concurrent tty removal from driver tableh]h(concurrent tty removal from driver table}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj\ubah}(h]h ]h"]h$]h&]uh1hhj)ubeh}(h]h ]h"]h$]h&]bulletjPuh1hhj=hMhj&ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj%hMhjubah}(h]h ]h"]h$]h&]uh1jhjyubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjyubh)}(h+the locked initialized :c:type:`tty_struct`h](hthe locked initialized }(hjhhhNhNubh)}(h:c:type:`tty_struct`h]j)}(hjh]h tty_struct}(hjhhhNhNubah}(h]h ](xrefj*c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocdriver-api/tty/tty_internals refdomainj*reftypetype refexplicitrefwarnj0j3)}j6]sb reftarget tty_structuh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjchhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_kopen_shared (C function)c.tty_kopen_sharedhNtauh1jhjchhhNhNubj)}(hhh](j)}(h3struct tty_struct * tty_kopen_shared (dev_t device)h]j)}(h1struct tty_struct *tty_kopen_shared(dev_t device)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,tty_kopen_sharedsbc.tty_kopen_sharedasbuh1hhjhhhjhMubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjM)}(hjPh]h*}(hjGhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjhhhjhMubj)}(htty_kopen_sharedh]j)}(hj6h]htty_kopen_shared}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubj)}(h(dev_t device)h]j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjxmodnameN classnameNj0j3)}j6]j4c.tty_kopen_sharedasbuh1hhjoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjkubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h*open a tty device for shared in-kernel useh]h*open a tty device for shared in-kernel use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjjjjjjuh1jhhhjchNhNubj)}(h**Parameters** ``dev_t device`` dev_t of device to open **Description** Opens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn't ensure to be the only user. Locking: identical to tty_kopen() above.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hj h]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj"hMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjHh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubh)}(hOpens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn't ensure to be the only user.h]hOpens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn’t ensure to be the only user.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubh)}(h(Locking: identical to tty_kopen() above.h]h(Locking: identical to tty_kopen() above.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjchhhNhNubeh}(h]jah ]h"]kopenah$]h&]uh1hhhhhhhhK ubh transition)}(h----h]h}(h]h ]h"]h$]h&]uh1jhhhKhhhhubh)}(hhh](h)}(hExported Internal Functionsh]hExported Internal Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]jtjuh1hhjhhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#tty_dev_name_to_number (C function)c.tty_dev_name_to_numberhNtauh1jhjhhhNhNubj)}(hhh](j)}(h h]hstruct tty_struct *tty}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj< ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMkhj8 ubj)}(hhh]h)}(h tty deviceh]h tty device}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS hMkhjT ubah}(h]h ]h"]h$]h&]uh1jhj8 ubeh}(h]h ]h"]h$]h&]uh1jhjS hMkhj5 ubj)}(h``int idx`` index of the tty h](j)}(h ``int idx``h]j)}(hjw h]hint idx}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMlhjq ubj)}(hhh]h)}(hindex of the ttyh]hindex of the tty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMlhj ubah}(h]h ]h"]h$]h&]uh1jhjq ubeh}(h]h ]h"]h$]h&]uh1jhj hMlhj5 ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMnhj ubh)}(hgPerforms the final steps to release and free a tty device. It is roughly the reverse of tty_init_dev().h]hgPerforms the final steps to release and free a tty device. It is roughly the reverse of tty_init_dev().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMmhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_get_icount (C function)c.tty_get_icounthNtauh1jhjhhhNhNubj)}(hhh](j)}(hRint tty_get_icount (struct tty_struct *tty, struct serial_icounter_struct *icount)h]j)}(hQint tty_get_icount(struct tty_struct *tty, struct serial_icounter_struct *icount)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM ubj)}(htty_get_icounth]j)}(htty_get_icounth]htty_get_icount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hM ubj)}(h?(struct tty_struct *tty, struct serial_icounter_struct *icount)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj4 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubj)}(h h]h }(hjA hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjR hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjT modnameN classnameNj0j3)}j6]j9)}j,j sbc.tty_get_icountasbuh1hhj0 ubj)}(h h]h }(hjr hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubjM)}(hjPh]h*}(hj hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj0 ubj)}(httyh]htty}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj, ubj)}(h%struct serial_icounter_struct *icounth](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hserial_icounter_structh]hserial_icounter_struct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj modnameN classnameNj0j3)}j6]jn c.tty_get_icountasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjM)}(hjPh]h*}(hj hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj ubj)}(hicounth]hicount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj, ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj hhubj)}(hhh]h)}(hget tty statisticsh]hget tty statistics}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hj$ hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj? jj? jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device ``struct serial_icounter_struct *icount`` output parameter **Description** Gets a copy of the **tty**'s icount statistics. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hjI h]h Parameters}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjC ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjh h]hstruct tty_struct *tty}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjb ubj)}(hhh]h)}(h tty deviceh]h tty device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj} hM hj~ ubah}(h]h ]h"]h$]h&]uh1jhjb ubeh}(h]h ]h"]h$]h&]uh1jhj} hM hj_ ubj)}(h;``struct serial_icounter_struct *icount`` output parameter h](j)}(h)``struct serial_icounter_struct *icount``h]j)}(hj h]h%struct serial_icounter_struct *icount}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hj ubj)}(hhh]h)}(houtput parameterh]houtput parameter}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM hj_ ubeh}(h]h ]h"]h$]h&]uh1jhjC ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjC ubh)}(h/Gets a copy of the **tty**'s icount statistics.h](hGets a copy of the }(hj hhhNhNubj)}(h**tty**h]htty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh’s icount statistics.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjC ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjC ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]j$ah ]h"]exported internal functionsah$]h&]uh1hhhhhhhhKubj)}(h----h]h}(h]h ]h"]h$]h&]uh1jhhhKhhhhubh)}(hhh](h)}(hInternal Functionsh]hInternal Functions}(hj=hhhNhNubah}(h]h ]h"]h$]h&]jtj@uh1hhj:hhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfree_tty_struct (C function)c.free_tty_structhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h-void free_tty_struct (struct tty_struct *tty)h]j)}(h,void free_tty_struct(struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhjrhKubj)}(hfree_tty_structh]j)}(hfree_tty_structh]hfree_tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhj`hhhjrhKubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,jsbc.free_tty_structasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjubj)}(httyh]htty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhj`hhhjrhKubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj\hhhjrhKubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjrhKhjYhhubj)}(hhh]h)}(hfree a disused ttyh]hfree a disused tty}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj!hhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjrhKubeh}(h]h ](j*functioneh"]h$]h&]jj*jj<jj<jjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty struct to free **Description** Free the write buffers, tty queue and tty memory itself. Locking: none. Must be called after tty is definitely unusedh](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj@ubj)}(hhh]j)}(h.``struct tty_struct *tty`` tty struct to free h](j)}(h``struct tty_struct *tty``h]j)}(hjeh]hstruct tty_struct *tty}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj_ubj)}(hhh]h)}(htty struct to freeh]htty struct to free}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhKhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhKhj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj@ubh)}(h8Free the write buffers, tty queue and tty memory itself.h]h8Free the write buffers, tty queue and tty memory itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj@ubh)}(hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(hfileh]hfile}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjQmodnameN classnameNj0j3)}j6]j9)}j,jsbc.tty_free_fileasbuh1hhj-ubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjM)}(hjPh]h*}(hj}hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj-ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj)ubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hfree file->private_datah]hfree file->private_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](j*functioneh"]h$]h&]jj*jjjjjjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct file *file`` to free private_data of **Description** This shall be used only for fail path handling when tty_add_file was not called yet.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubj)}(hhh]j)}(h.``struct file *file`` to free private_data of h](j)}(h``struct file *file``h]j)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubj)}(hhh]h)}(hto free private_data ofh]hto free private_data of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubh)}(hTThis shall be used only for fail path handling when tty_add_file was not called yet.h]hTThis shall be used only for fail path handling when tty_add_file was not called yet.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jget_tty_driver (C function)c.get_tty_driverhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h=struct tty_driver * get_tty_driver (dev_t device, int *index)h]j)}(h;struct tty_driver *get_tty_driver(dev_t device, int *index)h](j)}(hjh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM)ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhM)ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,get_tty_driversbc.get_tty_driverasbuh1hhjqhhhjhM)ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhM)ubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjqhhhjhM)ubj)}(hget_tty_driverh]j)}(hjh]hget_tty_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjqhhhjhM)ubj)}(h(dev_t device, int *index)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]jc.get_tty_driverasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h int *indexh](j)}(hinth]hint}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubjM)}(hjPh]h*}(hjShhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj3ubj)}(hindexh]hindex}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhjqhhhjhM)ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjmhhhjhM)ubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhjhM)hjjhhubj)}(hhh]h)}(hfind device of a ttyh]hfind device of a tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM)hjhhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjhM)ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjjjjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``dev_t device`` device identifier ``int *index`` returns the index of the tty **Description** This routine returns a tty driver structure, given a device number and also passes back the index number. Locking: caller must hold tty_mutexh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM-hjubj)}(hhh](j)}(h#``dev_t device`` device identifier h](j)}(h``dev_t device``h]j)}(hjh]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM*hjubj)}(hhh]h)}(hdevice identifierh]hdevice identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM*hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM*hjubj)}(h,``int *index`` returns the index of the tty h](j)}(h``int *index``h]j)}(hjh]h int *index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hjubj)}(hhh]h)}(hreturns the index of the ttyh]hreturns the index of the tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM-hjubh)}(hiThis routine returns a tty driver structure, given a device number and also passes back the index number.h]hiThis routine returns a tty driver structure, given a device number and also passes back the index number.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hjubh)}(h#Locking: caller must hold tty_mutexh]h#Locking: caller must hold tty_mutex}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!tty_release_redirect (C function)c.tty_release_redirecthNtauh1jhj:hhhNhNubj)}(hhh](j)}(h;struct file * tty_release_redirect (struct tty_struct *tty)h]j)}(h9struct file *tty_release_redirect(struct tty_struct *tty)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,tty_release_redirectsbc.tty_release_redirectasbuh1hhjhhhjhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjhhhjhM ubj)}(htty_release_redirecth]j)}(hjh]htty_release_redirect}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM ubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj-modnameN classnameNj0j3)}j6]jc.tty_release_redirectasbuh1hhj ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjM)}(hjPh]h*}(hjWhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj ubj)}(httyh]htty}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h&Release a redirect on a pty if presenth]h&Release a redirect on a pty if present}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjjjjjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device **Description** This is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjubj)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(hrThis is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.h]hrThis is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j__tty_hangup (C function)c.__tty_hanguphNtauh1jhj:hhhNhNubj)}(hhh](j)}(hsiglock to protect ->signal/->sighandh](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hj`ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM!hjubj)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM!hj|ubj)}(hH``int exit_session`` if non-zero, signal all foreground group processes h](j)}(h``int exit_session``h]j)}(hjh]hint exit_session}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM"hjubj)}(hhh]h)}(h2if non-zero, signal all foreground group processesh]h2if non-zero, signal all foreground group processes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM"hj|ubeh}(h]h ]h"]h$]h&]uh1jhj`ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hj`ubh)}(hThis can be called by a "kworker" kernel thread. That is process synchronous but doesn't hold any locks, so we need to make sure we have the appropriate locks for what we're doing.h]hThis can be called by a “kworker” kernel thread. That is process synchronous but doesn’t hold any locks, so we need to make sure we have the appropriate locks for what we’re doing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM#hj`ubh)}(hThe hangup event clears any pending redirections onto the hung up device. It ensures future writes will error and it does the needed line discipline hangup and signal delivery. The tty object itself remains intact.h]hThe hangup event clears any pending redirections onto the hung up device. It ensures future writes will error and it does the needed line discipline hangup and signal delivery. The tty object itself remains intact.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hj`ubj)}(hhh]j)}(hXLocking: * BTM * redirect lock for undoing redirection * file list lock for manipulating list of ttys * tty_ldiscs_lock from called functions * termios_rwsem resetting termios data * tasklist_lock to walk task list for hangup event * ->siglock to protect ->signal/->sighandh](j)}(hLocking:h]hLocking:}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM3hj0ubj)}(hhh](h)}(hhh]h)}(hBTM h]h)}(hBTMh]hBTM}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hjIubah}(h]h ]h"]h$]h&]uh1hhjFubah}(h]h ]h"]h$]h&]jzjPuh1hhj[hM,hjCubh block_quote)}(hX* redirect lock for undoing redirection * file list lock for manipulating list of ttys * tty_ldiscs_lock from called functions * termios_rwsem resetting termios data * tasklist_lock to walk task list for hangup event * ->siglock to protect ->signal/->sighandh](h)}(hhh](h)}(h%redirect lock for undoing redirectionh]h)}(hjsh]h%redirect lock for undoing redirection}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM.hjqubah}(h]h ]h"]h$]h&]uh1hhjnubh)}(h,file list lock for manipulating list of ttysh]h)}(hjh]h,file list lock for manipulating list of ttys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hjubah}(h]h ]h"]h$]h&]uh1hhjnubh)}(h%tty_ldiscs_lock from called functionsh]h)}(hjh]h%tty_ldiscs_lock from called functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM0hjubah}(h]h ]h"]h$]h&]uh1hhjnubh)}(h$termios_rwsem resetting termios datah]h)}(hjh]h$termios_rwsem resetting termios data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM1hjubah}(h]h ]h"]h$]h&]uh1hhjnubh)}(h1tasklist_lock to walk task list for hangup event h]h)}(h0tasklist_lock to walk task list for hangup eventh]h0tasklist_lock to walk task list for hangup event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM2hjubah}(h]h ]h"]h$]h&]uh1hhjnubeh}(h]h ]h"]h$]h&]jzjPuh1hhjhM.hjjubji)}(h)* ->siglock to protect ->signal/->sighandh]h)}(hhh]h)}(h'->siglock to protect ->signal/->sighandh]h)}(hjh]h'->siglock to protect ->signal/->sighand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM4hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]jzjPuh1hhjhM4hjubah}(h]h ]h"]h$]h&]uh1jhhjhM4hjjubeh}(h]h ]h"]h$]h&]uh1jhhjhM.hjCubeh}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhjBhM3hj-ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_vhangup_self (C function)c.tty_vhangup_selfhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hvoid tty_vhangup_self (void)h]j)}(hvoid tty_vhangup_self(void)h](j)}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjahMubj)}(htty_vhangup_selfh]j)}(htty_vhangup_selfh]htty_vhangup_self}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]hhuh1jhjOhhhjahMubj)}(h(void)h]j)}(hvoidh]j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjOhhhjahMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjKhhhjahMubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMhjHhhubj)}(hhh]h)}(hprocess vhangup for own cttyh]hprocess vhangup for own ctty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjjjjjjuh1jhhhj:hNhNubj)}(hj**Parameters** ``void`` no arguments **Description** Perform a vhangup on the current controlling ttyh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj6h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubh)}(h0Perform a vhangup on the current controlling ttyh]h0Perform a vhangup on the current controlling tty}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j tty_vhangup_session (C function)c.tty_vhangup_sessionhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h1void tty_vhangup_session (struct tty_struct *tty)h]j)}(h0void tty_vhangup_session(struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhjhMubj)}(htty_vhangup_sessionh]j)}(htty_vhangup_sessionh]htty_vhangup_session}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjwhhhjhMubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j9)}j,jsbc.tty_vhangup_sessionasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjubj)}(httyh]htty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjwhhhjhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjshhhjhMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjphhubj)}(hhh]h)}(hhangup session leader exith]hhangup session leader exit}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj8hhubah}(h]h ]h"]h$]h&]uh1jhjphhhjhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjSjjSjjjuh1jhhhj:hNhNubj)}(hX`**Parameters** ``struct tty_struct *tty`` tty to hangup **Description** The session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled ``SIGHUP``. We do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjWubj)}(hhh]j)}(h)``struct tty_struct *tty`` tty to hangup h](j)}(h``struct tty_struct *tty``h]j)}(hj|h]hstruct tty_struct *tty}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjvubj)}(hhh]h)}(h tty to hanguph]h tty to hangup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhjsubah}(h]h ]h"]h$]h&]uh1jhjWubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjWubh)}(hThe session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled ``SIGHUP``.h](hThe session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled }(hjhhhNhNubj)}(h ``SIGHUP``h]hSIGHUP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjWubh)}(hWe do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.h]hWe do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_read (C function) c.tty_readhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h:ssize_t tty_read (struct kiocb *iocb, struct iov_iter *to)h]j)}(h9ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj"modnameN classnameNj0j3)}j6]j9)}j,tty_readsb c.tty_readasbuh1hhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMzubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjAhMzubj)}(htty_readh]j)}(hj>h]htty_read}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjAhMzubj)}(h)(struct kiocb *iocb, struct iov_iter *to)h](j)}(hstruct kiocb *iocbh](j)}(hjh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubh)}(hhh]j)}(hkiocbh]hkiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j< c.tty_readasbuh1hhjkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubjM)}(hjPh]h*}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjkubj)}(hiocbh]hiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjgubj)}(hstruct iov_iter *toh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjmodnameN classnameNj0j3)}j6]j< c.tty_readasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjM)}(hjPh]h*}(hj)hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjubj)}(htoh]hto}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjgubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjAhMzubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhhhjAhMzubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjAhMzhjhhubj)}(hhh]h)}(h read method for tty device filesh]h read method for tty device files}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMzhj]hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjAhMzubeh}(h]h ](j*functioneh"]h$]h&]jj*jjxjjxjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct kiocb *iocb`` kernel I/O control block ``struct iov_iter *to`` destination for the data read **Description** Perform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method. Locking: Locks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM~hj|ubj)}(hhh](j)}(h0``struct kiocb *iocb`` kernel I/O control block h](j)}(h``struct kiocb *iocb``h]j)}(hjh]hstruct kiocb *iocb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM{hjubj)}(hhh]h)}(hkernel I/O control blockh]hkernel I/O control block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM{hjubj)}(h6``struct iov_iter *to`` destination for the data read h](j)}(h``struct iov_iter *to``h]j)}(hjh]hstruct iov_iter *to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM|hjubj)}(hhh]h)}(hdestination for the data readh]hdestination for the data read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM|hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM|hjubeh}(h]h ]h"]h$]h&]uh1jhj|ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM~hj|ubh)}(hPerform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method.h]hPerform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM}hj|ubj)}(hhh]j)}(hoLocking: Locks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h](j)}(hLocking:h]hLocking:}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj=ubj)}(hhh]h)}(hfLocks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h]hfLocks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjPubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj:ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_write (C function) c.tty_writehNtauh1jhj:hhhNhNubj)}(hhh](j)}(h=ssize_t tty_write (struct kiocb *iocb, struct iov_iter *from)h]j)}(h"sbc.pty_line_nameasbuh1hhjT"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT"ubjM)}(hjPh]h*}(hj"hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjT"ubj)}(hdriverh]hdriver}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjP"ubj)}(h int indexh](j)}(hinth]hint}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hindexh]hindex}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjP"ubj)}(hchar *ph](j)}(hcharh]hchar}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj #hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubjM)}(hjPh]h*}(hj#hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj"ubj)}(hjYh]hp}(hj(#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjP"ubeh}(h]h ]h"]h$]h&]hhuh1jhj"hhhj)"hMpubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj"hhhj)"hMpubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1jhj)"hMphj"hhubj)}(hhh]h)}(hgenerate name for a ptyh]hgenerate name for a pty}(hjQ#hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMphjN#hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj)"hMpubeh}(h]h ](j*functioneh"]h$]h&]jj*jji#jji#jjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_driver *driver`` the tty driver in use ``int index`` the minor number ``char *p`` output buffer of at least 6 bytes **Description** Generate a name from a **driver** reference and write it to the output buffer **p**. Locking: Noneh](h)}(h**Parameters**h]j)}(hjs#h]h Parameters}(hju#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq#ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMthjm#ubj)}(hhh](j)}(h4``struct tty_driver *driver`` the tty driver in use h](j)}(h``struct tty_driver *driver``h]j)}(hj#h]hstruct tty_driver *driver}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMqhj#ubj)}(hhh]h)}(hthe tty driver in useh]hthe tty driver in use}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMqhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMqhj#ubj)}(h``int index`` the minor number h](j)}(h ``int index``h]j)}(hj#h]h int index}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMrhj#ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMrhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMrhj#ubj)}(h.``char *p`` output buffer of at least 6 bytes h](j)}(h ``char *p``h]j)}(hj$h]hchar *p}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMshj#ubj)}(hhh]h)}(h!output buffer of at least 6 bytesh]h!output buffer of at least 6 bytes}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMshj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj$hMshj#ubeh}(h]h ]h"]h$]h&]uh1jhjm#ubh)}(h**Description**h]j)}(hj?$h]h Description}(hjA$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=$ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMuhjm#ubh)}(hTGenerate a name from a **driver** reference and write it to the output buffer **p**.h](hGenerate a name from a }(hjU$hhhNhNubj)}(h **driver**h]hdriver}(hj]$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU$ubh- reference and write it to the output buffer }(hjU$hhhNhNubj)}(h**p**h]hp}(hjo$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU$ubh.}(hjU$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMthjm#ubh)}(h Locking: Noneh]h Locking: None}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMwhjm#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_line_name (C function)c.tty_line_namehNtauh1jhj:hhhNhNubj)}(hhh](j)}(hEssize_t tty_line_name (struct tty_driver *driver, int index, char *p)h]j)}(hDssize_t tty_line_name(struct tty_driver *driver, int index, char *p)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj$modnameN classnameNj0j3)}j6]j9)}j, tty_line_namesbc.tty_line_nameasbuh1hhj$hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$hhhj$hMubj)}(h tty_line_nameh]j)}(hj$h]h tty_line_name}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj$hhhj$hMubj)}(h/(struct tty_driver *driver, int index, char *p)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj %hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj'%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$%ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj)%modnameN classnameNj0j3)}j6]j$c.tty_line_nameasbuh1hhj%ubj)}(h h]h }(hjE%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjM)}(hjPh]h*}(hjS%hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj%ubj)}(hdriverh]hdriver}(hj`%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj%ubj)}(h int indexh](j)}(hinth]hint}(hjy%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju%ubj)}(hindexh]hindex}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj%ubj)}(hchar *ph](j)}(hcharh]hchar}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjM)}(hjPh]h*}(hj%hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj%ubj)}(hjYh]hp}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj%ubeh}(h]h ]h"]h$]h&]hhuh1jhj$hhhj$hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj$hhhj$hMubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1jhj$hMhj$hhubj)}(hhh]h)}(hgenerate name for a ttyh]hgenerate name for a tty}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj%hhubah}(h]h ]h"]h$]h&]uh1jhj$hhhj$hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj&jj&jjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_driver *driver`` the tty driver in use ``int index`` the minor number ``char *p`` output buffer of at least 7 bytes **Description** Generate a name from a **driver** reference and write it to the output buffer **p**. Locking: Noneh](h)}(h**Parameters**h]j)}(hj"&h]h Parameters}(hj$&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj &ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubj)}(hhh](j)}(h4``struct tty_driver *driver`` the tty driver in use h](j)}(h``struct tty_driver *driver``h]j)}(hjA&h]hstruct tty_driver *driver}(hjC&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?&ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj;&ubj)}(hhh]h)}(hthe tty driver in useh]hthe tty driver in use}(hjZ&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV&hMhjW&ubah}(h]h ]h"]h$]h&]uh1jhj;&ubeh}(h]h ]h"]h$]h&]uh1jhjV&hMhj8&ubj)}(h``int index`` the minor number h](j)}(h ``int index``h]j)}(hjz&h]h int index}(hj|&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx&ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjt&ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhjt&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj8&ubj)}(h.``char *p`` output buffer of at least 7 bytes h](j)}(h ``char *p``h]j)}(hj&h]hchar *p}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubj)}(hhh]h)}(h!output buffer of at least 7 bytesh]h!output buffer of at least 7 bytes}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj8&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubh)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubh)}(hTGenerate a name from a **driver** reference and write it to the output buffer **p**.h](hGenerate a name from a }(hj'hhhNhNubj)}(h **driver**h]hdriver}(hj 'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh- reference and write it to the output buffer }(hj'hhhNhNubj)}(h**p**h]hp}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubh)}(h Locking: Noneh]h Locking: None}(hj7'hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"tty_driver_lookup_tty (C function)c.tty_driver_lookup_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hastruct tty_struct * tty_driver_lookup_tty (struct tty_driver *driver, struct file *file, int idx)h]j)}(h_struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, struct file *file, int idx)h](j)}(hjh]hstruct}(hjf'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb'hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjt'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb'hhhjs'hMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj'modnameN classnameNj0j3)}j6]j9)}j,tty_driver_lookup_ttysbc.tty_driver_lookup_ttyasbuh1hhjb'hhhjs'hMubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb'hhhjs'hMubjM)}(hjPh]h*}(hj'hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjb'hhhjs'hMubj)}(htty_driver_lookup_ttyh]j)}(hj'h]htty_driver_lookup_tty}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjb'hhhjs'hMubj)}(h7(struct tty_driver *driver, struct file *file, int idx)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj(modnameN classnameNj0j3)}j6]j'c.tty_driver_lookup_ttyasbuh1hhj'ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjM)}(hjPh]h*}(hj*(hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj'ubj)}(hdriverh]hdriver}(hj7(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(hstruct file *fileh](j)}(hjh]hstruct}(hjP(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL(ubj)}(h h]h }(hj](hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL(ubh)}(hhh]j)}(hfileh]hfile}(hjn(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk(ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjp(modnameN classnameNj0j3)}j6]j'c.tty_driver_lookup_ttyasbuh1hhjL(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL(ubjM)}(hjPh]h*}(hj(hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjL(ubj)}(hfileh]hfile}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(hint idxh](j)}(hinth]hint}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hidxh]hidx}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubeh}(h]h ]h"]h$]h&]hhuh1jhjb'hhhjs'hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj^'hhhjs'hMubah}(h]jY'ah ](jjeh"]h$]h&]jj)jhuh1jhjs'hMhj['hhubj)}(hhh]h)}(hfind an existing tty, if anyh]hfind an existing tty, if any}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj)hhubah}(h]h ]h"]h$]h&]uh1jhj['hhhjs'hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj)jj)jjjuh1jhhhj:hNhNubj)}(hXa**Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct file *file`` file object ``int idx`` the minor number **Return** the tty, if found. If not found, return ``NULL`` or ERR_PTR() if the driver lookup() method returns an error. **Description** Locking: tty_mutex must be held. If the tty is found, bump the tty kref.h](h)}(h**Parameters**h]j)}(hj()h]h Parameters}(hj*)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&)ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj")ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hjG)h]hstruct tty_driver *driver}(hjI)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE)ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjA)ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hj`)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\)hMhj])ubah}(h]h ]h"]h$]h&]uh1jhjA)ubeh}(h]h ]h"]h$]h&]uh1jhj\)hMhj>)ubj)}(h"``struct file *file`` file object h](j)}(h``struct file *file``h]j)}(hj)h]hstruct file *file}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~)ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjz)ubj)}(hhh]h)}(h file objecth]h file object}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhjz)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj>)ubj)}(h``int idx`` the minor number h](j)}(h ``int idx``h]j)}(hj)h]hint idx}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj)ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj>)ubeh}(h]h ]h"]h$]h&]uh1jhj")ubh)}(h **Return**h]j)}(hj)h]hReturn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj")ubh)}(hmthe tty, if found. If not found, return ``NULL`` or ERR_PTR() if the driver lookup() method returns an error.h](h(the tty, if found. If not found, return }(hj *hhhNhNubj)}(h``NULL``h]hNULL}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj *ubh= or ERR_PTR() if the driver lookup() method returns an error.}(hj *hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj")ubh)}(h**Description**h]j)}(hj-*h]h Description}(hj/*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+*ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj")ubh)}(hHLocking: tty_mutex must be held. If the tty is found, bump the tty kref.h]hHLocking: tty_mutex must be held. If the tty is found, bump the tty kref.}(hjC*hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj")ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#tty_driver_install_tty (C function)c.tty_driver_install_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hNint tty_driver_install_tty (struct tty_driver *driver, struct tty_struct *tty)h]j)}(hMint tty_driver_install_tty(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hinth]hint}(hjr*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn*hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn*hhhj*hMubj)}(htty_driver_install_ttyh]j)}(htty_driver_install_ttyh]htty_driver_install_tty}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjn*hhhj*hMubj)}(h3(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj*modnameN classnameNj0j3)}j6]j9)}j,j*sbc.tty_driver_install_ttyasbuh1hhj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjM)}(hjPh]h*}(hj*hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj*ubj)}(hdriverh]hdriver}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubj)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj!+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj.+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj?+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<+ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjA+modnameN classnameNj0j3)}j6]j*c.tty_driver_install_ttyasbuh1hhj+ubj)}(h h]h }(hj]+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjM)}(hjPh]h*}(hjk+hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj+ubj)}(httyh]htty}(hjx+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubeh}(h]h ]h"]h$]h&]hhuh1jhjn*hhhj*hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjj*hhhj*hMubah}(h]je*ah ](jjeh"]h$]h&]jj)jhuh1jhj*hMhjg*hhubj)}(hhh]h)}(h!install a tty entry in the driverh]h!install a tty entry in the driver}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+hhubah}(h]h ]h"]h$]h&]uh1jhjg*hhhj*hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj+jj+jjjuh1jhhhj:hNhNubj)}(hXm**Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct tty_struct *tty`` the tty **Description** Install a tty object into the driver tables. The **tty->index** field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured. Locking: tty_mutex for nowh](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hj+h]hstruct tty_driver *driver}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hMhj+ubj)}(h#``struct tty_struct *tty`` the tty h](j)}(h``struct tty_struct *tty``h]j)}(hj,h]hstruct tty_struct *tty}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj,ubj)}(hhh]h)}(hthe ttyh]hthe tty}(hj5,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1,hMhj2,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj1,hMhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+ubh)}(h**Description**h]j)}(hjW,h]h Description}(hjY,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU,ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubh)}(hInstall a tty object into the driver tables. The **tty->index** field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured.h](h1Install a tty object into the driver tables. The }(hjm,hhhNhNubj)}(h**tty->index**h]h tty->index}(hju,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm,ubh field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured.}(hjm,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubh)}(hLocking: tty_mutex for nowh]hLocking: tty_mutex for now}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"tty_driver_remove_tty (C function)c.tty_driver_remove_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hNvoid tty_driver_remove_tty (struct tty_driver *driver, struct tty_struct *tty)h]j)}(hMvoid tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj,hMubj)}(htty_driver_remove_ttyh]j)}(htty_driver_remove_ttyh]htty_driver_remove_tty}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,hhhj,hMubj)}(h3(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj-modnameN classnameNj0j3)}j6]j9)}j,j,sbc.tty_driver_remove_ttyasbuh1hhj,ubj)}(h h]h }(hj8-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubjM)}(hjPh]h*}(hjF-hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj,ubj)}(hdriverh]hdriver}(hjS-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj,ubj)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjl-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh-ubj)}(h h]h }(hjy-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh-ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj-modnameN classnameNj0j3)}j6]j4-c.tty_driver_remove_ttyasbuh1hhjh-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh-ubjM)}(hjPh]h*}(hj-hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjh-ubj)}(httyh]htty}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj,ubeh}(h]h ]h"]h$]h&]hhuh1jhj,hhhj,hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj,hhhj,hMubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jhj,hMhj,hhubj)}(hhh]h)}(h#remove a tty from the driver tablesh]h#remove a tty from the driver tables}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj-hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj,hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj.jj.jjjuh1jhhhj:hNhNubj)}(hX **Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct tty_struct *tty`` tty to remove **Description** Remove a tty object from the driver tables. The tty->index field will be set by the time this is called. Locking: tty_mutex for nowh](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj .ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj .ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hj..h]hstruct tty_driver *driver}(hj0.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,.ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(.ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hjG.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC.hMhjD.ubah}(h]h ]h"]h$]h&]uh1jhj(.ubeh}(h]h ]h"]h$]h&]uh1jhjC.hMhj%.ubj)}(h)``struct tty_struct *tty`` tty to remove h](j)}(h``struct tty_struct *tty``h]j)}(hjg.h]hstruct tty_struct *tty}(hji.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje.ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhja.ubj)}(hhh]h)}(h tty to removeh]h tty to remove}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|.hMhj}.ubah}(h]h ]h"]h$]h&]uh1jhja.ubeh}(h]h ]h"]h$]h&]uh1jhj|.hMhj%.ubeh}(h]h ]h"]h$]h&]uh1jhj .ubh)}(h**Description**h]j)}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj .ubh)}(hhRemove a tty object from the driver tables. The tty->index field will be set by the time this is called.h]hhRemove a tty object from the driver tables. The tty->index field will be set by the time this is called.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj .ubh)}(hLocking: tty_mutex for nowh]hLocking: tty_mutex for now}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj .ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_reopen (C function) c.tty_reopenhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h'int tty_reopen (struct tty_struct *tty)h]j)}(h&int tty_reopen(struct tty_struct *tty)h](j)}(hinth]hint}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhj/hM ubj)}(h tty_reopenh]j)}(h tty_reopenh]h tty_reopen}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj.hhhj/hM ubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj3/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj//ubj)}(h h]h }(hj@/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj//ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjQ/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN/ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjS/modnameN classnameNj0j3)}j6]j9)}j,j/sb c.tty_reopenasbuh1hhj//ubj)}(h h]h }(hjq/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj//ubjM)}(hjPh]h*}(hj/hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj//ubj)}(httyh]htty}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj//ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+/ubah}(h]h ]h"]h$]h&]hhuh1jhj.hhhj/hM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj.hhhj/hM ubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhj/hM hj.hhubj)}(hhh]h)}(hfast re-open of an open ttyh]hfast re-open of an open tty}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj/hhubah}(h]h ]h"]h$]h&]uh1jhj.hhhj/hM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj/jj/jjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` the tty to open **Description** Re-opens on master ptys are not allowed and return -``EIO``. Locking: Caller must hold tty_lock **Return** 0 on success, -errno on error.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj/ubj)}(hhh]j)}(h+``struct tty_struct *tty`` the tty to open h](j)}(h``struct tty_struct *tty``h]j)}(hj/h]hstruct tty_struct *tty}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj/ubj)}(hhh]h)}(hthe tty to openh]hthe tty to open}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 0hM hj 0ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj 0hM hj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubh)}(h**Description**h]j)}(hj20h]h Description}(hj40hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj00ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj/ubh)}(hhj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hM?hj2ubah}(h]h ]h"]h$]h&]uh1jhj 2ubh)}(hOn exit the tty device has the line discipline attached and a reference count of 1. If a pair was created for pty/tty use and the other was a pty master then it too has a reference count of 1.h]hOn exit the tty device has the line discipline attached and a reference count of 1. If a pair was created for pty/tty use and the other was a pty master then it too has a reference count of 1.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMAhj 2ubh)}(hWSH 06/09/97: Rewritten to remove races and properly clean up after a failed open. The new code protects the open with a mutex, so it's really quite straightforward. The mutex locking can probably be relaxed for the (most common) case of reopening a tty.h]hXWSH 06/09/97: Rewritten to remove races and properly clean up after a failed open. The new code protects the open with a mutex, so it’s really quite straightforward. The mutex locking can probably be relaxed for the (most common) case of reopening a tty.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMEhj 2ubh)}(h **Return**h]j)}(hj#3h]hReturn}(hj%3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!3ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhj 2ubh)}(hnew tty structureh]hnew tty structure}(hj93hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMKhj 2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_flush_works (C function)c.tty_flush_workshNtauh1jhj:hhhNhNubj)}(hhh](j)}(h-void tty_flush_works (struct tty_struct *tty)h]j)}(h,void tty_flush_works(struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjh3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd3hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjw3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd3hhhjv3hMubj)}(htty_flush_worksh]j)}(htty_flush_worksh]htty_flush_works}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjd3hhhjv3hMubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj3modnameN classnameNj0j3)}j6]j9)}j,j3sbc.tty_flush_worksasbuh1hhj3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubjM)}(hjPh]h*}(hj3hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj3ubj)}(httyh]htty}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj3ubah}(h]h ]h"]h$]h&]hhuh1jhjd3hhhjv3hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj`3hhhjv3hMubah}(h]j[3ah ](jjeh"]h$]h&]jj)jhuh1jhjv3hMhj]3hhubj)}(hhh]h)}(h!flush all works of a tty/pty pairh]h!flush all works of a tty/pty pair}(hj(4hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj%4hhubah}(h]h ]h"]h$]h&]uh1jhj]3hhhjv3hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj@4jj@4jjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device to flush works for (or either end of a pty pair) **Description** Sync flush all works belonging to **tty** (and the 'other' tty).h](h)}(h**Parameters**h]j)}(hjJ4h]h Parameters}(hjL4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH4ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjD4ubj)}(hhh]j)}(hW``struct tty_struct *tty`` tty device to flush works for (or either end of a pty pair) h](j)}(h``struct tty_struct *tty``h]j)}(hji4h]hstruct tty_struct *tty}(hjk4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg4ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjc4ubj)}(hhh]h)}(h;tty device to flush works for (or either end of a pty pair)h]h;tty device to flush works for (or either end of a pty pair)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~4hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjc4ubeh}(h]h ]h"]h$]h&]uh1jhj~4hMhj`4ubah}(h]h ]h"]h$]h&]uh1jhjD4ubh)}(h**Description**h]j)}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjD4ubh)}(h@Sync flush all works belonging to **tty** (and the 'other' tty).h](h"Sync flush all works belonging to }(hj4hhhNhNubj)}(h**tty**h]htty}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh (and the ‘other’ tty).}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjD4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jrelease_one_tty (C function)c.release_one_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h/void release_one_tty (struct work_struct *work)h]j)}(h.void release_one_tty(struct work_struct *work)h](j)}(hvoidh]hvoid}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj 5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhj 5hMubj)}(hrelease_one_ttyh]j)}(hrelease_one_ttyh]hrelease_one_tty}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj4hhhj 5hMubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](j)}(hjh]hstruct}(hj85hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj45ubj)}(h h]h }(hjE5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj45ubh)}(hhh]j)}(h work_structh]h work_struct}(hjV5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS5ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjX5modnameN classnameNj0j3)}j6]j9)}j,j5sbc.release_one_ttyasbuh1hhj45ubj)}(h h]h }(hjv5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj45ubjM)}(hjPh]h*}(hj5hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj45ubj)}(hworkh]hwork}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj45ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj05ubah}(h]h ]h"]h$]h&]hhuh1jhj4hhhj 5hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj4hhhj 5hMubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj 5hMhj4hhubj)}(hhh]h)}(hrelease tty structure memoryh]hrelease tty structure memory}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj 5hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj5jj5jjjuh1jhhhj:hNhNubj)}(hX **Parameters** ``struct work_struct *work`` work of tty we are obliterating **Description** Releases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails. Locking: takes the file list lock internally when working on the list of ttys that the driver keeps. This method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)h](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5ubj)}(hhh]j)}(h=``struct work_struct *work`` work of tty we are obliterating h](j)}(h``struct work_struct *work``h]j)}(hj5h]hstruct work_struct *work}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5ubj)}(hhh]h)}(hwork of tty we are obliteratingh]hwork of tty we are obliterating}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj6hMhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubh)}(h**Description**h]j)}(hj76h]h Description}(hj96hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj56ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5ubh)}(hReleases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails.h]hReleases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails.}(hjM6hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5ubj)}(hhh]j)}(heLocking: takes the file list lock internally when working on the list of ttys that the driver keeps. h](j)}(hLocking:h]hLocking:}(hjc6hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_6ubj)}(hhh]h)}(h[takes the file list lock internally when working on the list of ttys that the driver keeps.h]h[takes the file list lock internally when working on the list of ttys that the driver keeps.}(hju6hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjr6ubah}(h]h ]h"]h$]h&]uh1jhj_6ubeh}(h]h ]h"]h$]h&]uh1jhjq6hMhj\6ubah}(h]h ]h"]h$]h&]uh1jhj5ubh)}(htThis method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)h]htThis method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jrelease_tty (C function) c.release_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h2void release_tty (struct tty_struct *tty, int idx)h]j)}(h1void release_tty(struct tty_struct *tty, int idx)h](j)}(hvoidh]hvoid}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhj6hMubj)}(h release_ttyh]j)}(h release_ttyh]h release_tty}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj6hhhj6hMubj)}(h!(struct tty_struct *tty, int idx)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj 7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj"7modnameN classnameNj0j3)}j6]j9)}j,j6sb c.release_ttyasbuh1hhj6ubj)}(h h]h }(hj@7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjM)}(hjPh]h*}(hjN7hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj6ubj)}(httyh]htty}(hj[7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj6ubj)}(hint idxh](j)}(hinth]hint}(hjt7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp7ubj)}(hidxh]hidx}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj6ubeh}(h]h ]h"]h$]h&]hhuh1jhj6hhhj6hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj6hhhj6hMubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhj6hhubj)}(hhh]h)}(hrelease tty structure memoryh]hrelease tty structure memory}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj6hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj7jj7jjjuh1jhhhj:hNhNubj)}(hXv**Parameters** ``struct tty_struct *tty`` tty device release ``int idx`` index of the tty device release **Description** Release both **tty** and a possible linked partner (think pty pair), and decrement the refcount of the backing module. Locking: tty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh](j)}(h.``struct tty_struct *tty`` tty device release h](j)}(h``struct tty_struct *tty``h]j)}(hj7h]hstruct tty_struct *tty}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh]h)}(htty device releaseh]htty device release}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj7ubj)}(h,``int idx`` index of the tty device release h](j)}(h ``int idx``h]j)}(hj48h]hint idx}(hj68hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj28ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj.8ubj)}(hhh]h)}(hindex of the tty device releaseh]hindex of the tty device release}(hjM8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjI8hMhjJ8ubah}(h]h ]h"]h$]h&]uh1jhj.8ubeh}(h]h ]h"]h$]h&]uh1jhjI8hMhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7ubh)}(h**Description**h]j)}(hjo8h]h Description}(hjq8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm8ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubh)}(hvRelease both **tty** and a possible linked partner (think pty pair), and decrement the refcount of the backing module.h](h Release both }(hj8hhhNhNubj)}(h**tty**h]htty}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubhb and a possible linked partner (think pty pair), and decrement the refcount of the backing module.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh]j)}(hnLocking: tty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h](j)}(hLocking:h]hLocking:}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj8ubj)}(hhh]h)}(hetty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h]hetty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_release_checks (C function)c.tty_release_checkshNtauh1jhj:hhhNhNubj)}(hhh](j)}(h8int tty_release_checks (struct tty_struct *tty, int idx)h]j)}(h7int tty_release_checks(struct tty_struct *tty, int idx)h](j)}(hinth]hint}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM"ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj9hM"ubj)}(htty_release_checksh]j)}(htty_release_checksh]htty_release_checks}(hj!9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj8hhhj9hM"ubj)}(h!(struct tty_struct *tty, int idx)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj=9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj99ubj)}(h h]h }(hjJ9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj99ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj[9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX9ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj]9modnameN classnameNj0j3)}j6]j9)}j,j#9sbc.tty_release_checksasbuh1hhj99ubj)}(h h]h }(hj{9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj99ubjM)}(hjPh]h*}(hj9hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj99ubj)}(httyh]htty}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj99ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj59ubj)}(hint idxh](j)}(hinth]hint}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hidxh]hidx}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj59ubeh}(h]h ]h"]h$]h&]hhuh1jhj8hhhj9hM"ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj8hhhj9hM"ubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhj9hM"hj8hhubj)}(hhh]h)}(hcheck a tty before real releaseh]hcheck a tty before real release}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM"hj9hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj9hM"ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj :jj :jjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty to check ``int idx`` index of the tty **Description** Performs some paranoid checking before true release of the **tty**. This is a no-op unless ``TTY_PARANOIA_CHECK`` is defined.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM&hj:ubj)}(hhh](j)}(h(``struct tty_struct *tty`` tty to check h](j)}(h``struct tty_struct *tty``h]j)}(hj6:h]hstruct tty_struct *tty}(hj8:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4:ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM#hj0:ubj)}(hhh]h)}(h tty to checkh]h tty to check}(hjO:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK:hM#hjL:ubah}(h]h ]h"]h$]h&]uh1jhj0:ubeh}(h]h ]h"]h$]h&]uh1jhjK:hM#hj-:ubj)}(h``int idx`` index of the tty h](j)}(h ``int idx``h]j)}(hjo:h]hint idx}(hjq:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm:ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hji:ubj)}(hhh]h)}(hindex of the ttyh]hindex of the tty}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hM$hj:ubah}(h]h ]h"]h$]h&]uh1jhji:ubeh}(h]h ]h"]h$]h&]uh1jhj:hM$hj-:ubeh}(h]h ]h"]h$]h&]uh1jhj:ubh)}(h**Description**h]j)}(hj:h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM&hj:ubh)}(h}Performs some paranoid checking before true release of the **tty**. This is a no-op unless ``TTY_PARANOIA_CHECK`` is defined.h](h;Performs some paranoid checking before true release of the }(hj:hhhNhNubj)}(h**tty**h]htty}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh. This is a no-op unless }(hj:hhhNhNubj)}(h``TTY_PARANOIA_CHECK``h]hTTY_PARANOIA_CHECK}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh is defined.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM%hj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_release (C function) c.tty_releasehNtauh1jhj:hhhNhNubj)}(hhh](j)}(h8int tty_release (struct inode *inode, struct file *filp)h]j)}(h7int tty_release(struct inode *inode, struct file *filp)h](j)}(hinth]hint}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj";hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj!;hMubj)}(h tty_releaseh]j)}(h tty_releaseh]h tty_release}(hj4;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0;ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;hhhj!;hMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjP;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL;ubj)}(h h]h }(hj];hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL;ubh)}(hhh]j)}(hinodeh]hinode}(hjn;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk;ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjp;modnameN classnameNj0j3)}j6]j9)}j,j6;sb c.tty_releaseasbuh1hhjL;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL;ubjM)}(hjPh]h*}(hj;hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjL;ubj)}(hinodeh]hinode}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjH;ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubh)}(hhh]j)}(hfileh]hfile}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj;modnameN classnameNj0j3)}j6]j; c.tty_releaseasbuh1hhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubjM)}(hjPh]h*}(hj <hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj;ubj)}(hfilph]hfilp}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjH;ubeh}(h]h ]h"]h$]h&]hhuh1jhj;hhhj!;hMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj ;hhhj!;hMubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj!;hMhj;hhubj)}(hhh]h)}(hvfs callback for closeh]hvfs callback for close}(hjC<hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj@<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj!;hMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj[<jj[<jjjuh1jhhhj:hNhNubj)}(hXi**Parameters** ``struct inode *inode`` inode of tty ``struct file *filp`` file pointer for handle to tty **Description** Called the last time each file handle is closed that references this tty. There may however be several such references. Locking: Takes BKL. See tty_release_dev(). Even releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers. WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.h](h)}(h**Parameters**h]j)}(hje<h]h Parameters}(hjg<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc<ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_<ubj)}(hhh](j)}(h%``struct inode *inode`` inode of tty h](j)}(h``struct inode *inode``h]j)}(hj<h]hstruct inode *inode}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj~<ubj)}(hhh]h)}(h inode of ttyh]h inode of tty}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj~<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj{<ubj)}(h5``struct file *filp`` file pointer for handle to tty h](j)}(h``struct file *filp``h]j)}(hj<h]hstruct file *filp}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj<ubj)}(hhh]h)}(hfile pointer for handle to ttyh]hfile pointer for handle to tty}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj{<ubeh}(h]h ]h"]h$]h&]uh1jhj_<ubh)}(h**Description**h]j)}(hj<h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_<ubh)}(hwCalled the last time each file handle is closed that references this tty. There may however be several such references.h]hwCalled the last time each file handle is closed that references this tty. There may however be several such references.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_<ubj)}(hhh]j)}(h+Locking: Takes BKL. See tty_release_dev(). h](j)}(hLocking:h]hLocking:}(hj$=hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj =ubj)}(hhh]h)}(h!Takes BKL. See tty_release_dev().h]h!Takes BKL. See tty_release_dev().}(hj6=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2=hMhj3=ubah}(h]h ]h"]h$]h&]uh1jhj =ubeh}(h]h ]h"]h$]h&]uh1jhj2=hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj_<ubh)}(hEven releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers.h]hEven releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers.}(hjV=hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_<ubh)}(h}WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.h]h}WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.}(hje=hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj_<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!tty_open_current_tty (C function)c.tty_open_current_ttyhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hJstruct tty_struct * tty_open_current_tty (dev_t device, struct file *filp)h]j)}(hHstruct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)h](j)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM&ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hM&ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj=modnameN classnameNj0j3)}j6]j9)}j,tty_open_current_ttysbc.tty_open_current_ttyasbuh1hhj=hhhj=hM&ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hM&ubjM)}(hjPh]h*}(hj=hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj=hhhj=hM&ubj)}(htty_open_current_ttyh]j)}(hj=h]htty_open_current_tty}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj=hhhj=hM&ubj)}(h!(dev_t device, struct file *filp)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj>modnameN classnameNj0j3)}j6]j=c.tty_open_current_ttyasbuh1hhj >ubj)}(h h]h }(hj/>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj >ubj)}(hdeviceh]hdevice}(hj=>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj >ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj>ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjV>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR>ubj)}(h h]h }(hjc>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR>ubh)}(hhh]j)}(hfileh]hfile}(hjt>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq>ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjv>modnameN classnameNj0j3)}j6]j=c.tty_open_current_ttyasbuh1hhjR>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR>ubjM)}(hjPh]h*}(hj>hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjR>ubj)}(hfilph]hfilp}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj>ubeh}(h]h ]h"]h$]h&]hhuh1jhj=hhhj=hM&ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj=hhhj=hM&ubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hM&hj=hhubj)}(hhh]h)}(hget locked tty of current taskh]hget locked tty of current task}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM&hj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hM&ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj>jj>jjjuh1jhhhj:hNhNubj)}(hXw**Parameters** ``dev_t device`` device number ``struct file *filp`` file pointer to tty **Return** locked tty of the current task iff **device** is /dev/tty **Description** Performs a re-open of the current task's controlling tty. We cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM*hj>ubj)}(hhh](j)}(h``dev_t device`` device number h](j)}(h``dev_t device``h]j)}(hj?h]h dev_t device}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hj?ubj)}(hhh]h)}(h device numberh]h device number}(hj1?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-?hM'hj.?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj-?hM'hj?ubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjQ?h]hstruct file *filp}(hjS?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO?ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM(hjK?ubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjf?hM(hjg?ubah}(h]h ]h"]h$]h&]uh1jhjK?ubeh}(h]h ]h"]h$]h&]uh1jhjf?hM(hj?ubeh}(h]h ]h"]h$]h&]uh1jhj>ubh)}(h **Return**h]j)}(hj?h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM*hj>ubh)}(h9locked tty of the current task iff **device** is /dev/ttyh](h#locked tty of the current task iff }(hj?hhhNhNubj)}(h **device**h]hdevice}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh is /dev/tty}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM)hj>ubh)}(h**Description**h]j)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hj>ubh)}(h9Performs a re-open of the current task's controlling tty.h]h;Performs a re-open of the current task’s controlling tty.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM*hj>ubh)}(hWe cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.h]hWe cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_lookup_driver (C function)c.tty_lookup_driverhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hSstruct tty_driver * tty_lookup_driver (dev_t device, struct file *filp, int *index)h]j)}(hQstruct tty_driver *tty_lookup_driver(dev_t device, struct file *filp, int *index)h](j)}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJubj)}(h h]h }(hj'@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj&@hMJubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj8@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5@ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj:@modnameN classnameNj0j3)}j6]j9)}j,tty_lookup_driversbc.tty_lookup_driverasbuh1hhj@hhhj&@hMJubj)}(h h]h }(hjY@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj&@hMJubjM)}(hjPh]h*}(hjg@hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj@hhhj&@hMJubj)}(htty_lookup_driverh]j)}(hjV@h]htty_lookup_driver}(hjx@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt@ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj@hhhj&@hMJubj)}(h-(dev_t device, struct file *filp, int *index)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj@modnameN classnameNj0j3)}j6]jT@c.tty_lookup_driverasbuh1hhj@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hdeviceh]hdevice}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj@ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(hfileh]hfile}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj@modnameN classnameNj0j3)}j6]jT@c.tty_lookup_driverasbuh1hhj@ubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubjM)}(hjPh]h*}(hj%AhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj@ubj)}(hfilph]hfilp}(hj2AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj@ubj)}(h int *indexh](j)}(hinth]hint}(hjKAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGAubj)}(h h]h }(hjYAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGAubjM)}(hjPh]h*}(hjgAhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjGAubj)}(hindexh]hindex}(hjtAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGAubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj@ubeh}(h]h ]h"]h$]h&]hhuh1jhj@hhhj&@hMJubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj@hhhj&@hMJubah}(h]j @ah ](jjeh"]h$]h&]jj)jhuh1jhj&@hMJhj@hhubj)}(hhh]h)}(h+lookup a tty driver for a given device fileh]h+lookup a tty driver for a given device file}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhjAhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj&@hMJubeh}(h]h ](j*functioneh"]h$]h&]jj*jjAjjAjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``dev_t device`` device number ``struct file *filp`` file pointer to tty ``int *index`` index for the device in the **return** driver **Description** If returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put(). Locking: ``tty_mutex`` protects get_tty_driver() **Return** driver for this inode (with increased refcount)h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMNhjAubj)}(hhh](j)}(h``dev_t device`` device number h](j)}(h``dev_t device``h]j)}(hjAh]h dev_t device}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMKhjAubj)}(hhh]h)}(h device numberh]h device number}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMKhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAhMKhjAubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjBh]hstruct file *filp}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMLhjBubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hj1BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-BhMLhj.Bubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj-BhMLhjAubj)}(h=``int *index`` index for the device in the **return** driver h](j)}(h``int *index``h]j)}(hjQBh]h int *index}(hjSBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOBubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMMhjKBubj)}(hhh]h)}(h-index for the device in the **return** driverh](hindex for the device in the }(hjjBhhhNhNubj)}(h **return**h]hreturn}(hjrBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjBubh driver}(hjjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjfBhMMhjgBubah}(h]h ]h"]h$]h&]uh1jhjKBubeh}(h]h ]h"]h$]h&]uh1jhjfBhMMhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubh)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMOhjAubh)}(hqIf returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put().h]hqIf returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put().}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMNhjAubh)}(h0Locking: ``tty_mutex`` protects get_tty_driver()h](h Locking: }(hjBhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh protects get_tty_driver()}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMQhjAubh)}(h **Return**h]j)}(hjBh]hReturn}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMShjAubh)}(h/driver for this inode (with increased refcount)h]h/driver for this inode (with increased refcount)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMThjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_open_by_driver (C function)c.tty_open_by_driverhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hHstruct tty_struct * tty_open_by_driver (dev_t device, struct file *filp)h]j)}(hFstruct tty_struct *tty_open_by_driver(dev_t device, struct file *filp)h](j)}(hjh]hstruct}(hj+ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Chhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj9ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Chhhj8ChMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjJChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGCubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjLCmodnameN classnameNj0j3)}j6]j9)}j,tty_open_by_driversbc.tty_open_by_driverasbuh1hhj'Chhhj8ChMubj)}(h h]h }(hjkChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Chhhj8ChMubjM)}(hjPh]h*}(hjyChhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj'Chhhj8ChMubj)}(htty_open_by_driverh]j)}(hjhCh]htty_open_by_driver}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]hhuh1jhj'Chhhj8ChMubj)}(h!(dev_t device, struct file *filp)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjCmodnameN classnameNj0j3)}j6]jfCc.tty_open_by_driverasbuh1hhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hdeviceh]hdevice}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjCubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubh)}(hhh]j)}(hfileh]hfile}(hj DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj DmodnameN classnameNj0j3)}j6]jfCc.tty_open_by_driverasbuh1hhjCubj)}(h h]h }(hj)DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubjM)}(hjPh]h*}(hj7DhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjCubj)}(hfilph]hfilp}(hjDDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjCubeh}(h]h ]h"]h$]h&]hhuh1jhj'Chhhj8ChMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj#Chhhj8ChMubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhj8ChMhj Chhubj)}(hhh]h)}(hopen a tty deviceh]hopen a tty device}(hjnDhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjkDhhubah}(h]h ]h"]h$]h&]uh1jhj Chhhj8ChMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjDjjDjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``dev_t device`` dev_t of device to open ``struct file *filp`` file pointer to tty **Description** Performs the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization. Claims the global tty_mutex to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table **Return** the locked initialized or re-opened :c:type:`tty_struct`h](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubj)}(hhh](j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hjDh]h dev_t device}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjDubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjDh]hstruct file *filp}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjDubeh}(h]h ]h"]h$]h&]uh1jhjDubh)}(h**Description**h]j)}(hj#Eh]h Description}(hj%EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!Eubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubh)}(hiPerforms the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization.h]hiPerforms the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization.}(hj9EhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubj)}(hhh]j)}(hClaims the global tty_mutex to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table h](j)}(h)Claims the global tty_mutex to serialize:h]h)Claims the global tty_mutex to serialize:}(hjOEhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjKEubj)}(hhh]h)}(hhh](h)}(h(concurrent first-time tty initializationh]h)}(hjfEh]h(concurrent first-time tty initialization}(hjhEhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjdEubah}(h]h ]h"]h$]h&]uh1hhjaEubh)}(h'concurrent tty driver removal w/ lookuph]h)}(hj~Eh]h'concurrent tty driver removal w/ lookup}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj|Eubah}(h]h ]h"]h$]h&]uh1hhjaEubh)}(h)concurrent tty removal from driver table h]h)}(h(concurrent tty removal from driver tableh]h(concurrent tty removal from driver table}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]EhMhjEubah}(h]h ]h"]h$]h&]uh1hhjaEubeh}(h]h ]h"]h$]h&]jzjPuh1hhjuEhMhj^Eubah}(h]h ]h"]h$]h&]uh1jhjKEubeh}(h]h ]h"]h$]h&]uh1jhj]EhMhjHEubah}(h]h ]h"]h$]h&]uh1jhjDubh)}(h **Return**h]j)}(hjEh]hReturn}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjDubh)}(h8the locked initialized or re-opened :c:type:`tty_struct`h](h$the locked initialized or re-opened }(hjEhhhNhNubh)}(h:c:type:`tty_struct`h]j)}(hjEh]h tty_struct}(hjEhhhNhNubah}(h]h ](jj*c-typeeh"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]refdocj refdomainj*reftypetype refexplicitrefwarnj0jj tty_structuh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjEubeh}(h]h ]h"]h$]h&]uh1hhjFhMhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_open (C function) c.tty_openhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h5int tty_open (struct inode *inode, struct file *filp)h]j)}(h4int tty_open(struct inode *inode, struct file *filp)h](j)}(hinth]hint}(hj*FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&Fhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj9FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&Fhhhj8FhMubj)}(htty_openh]j)}(htty_openh]htty_open}(hjKFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGFubah}(h]h ](jjeh"]h$]h&]hhuh1jhj&Fhhhj8FhMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjgFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcFubj)}(h h]h }(hjtFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcFubh)}(hhh]j)}(hinodeh]hinode}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjFmodnameN classnameNj0j3)}j6]j9)}j,jMFsb c.tty_openasbuh1hhjcFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcFubjM)}(hjPh]h*}(hjFhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjcFubj)}(hinodeh]hinode}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj_Fubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hfileh]hfile}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjFmodnameN classnameNj0j3)}j6]jF c.tty_openasbuh1hhjFubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjM)}(hjPh]h*}(hj#GhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjFubj)}(hfilph]hfilp}(hj0GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj_Fubeh}(h]h ]h"]h$]h&]hhuh1jhj&Fhhhj8FhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj"Fhhhj8FhMubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhj8FhMhjFhhubj)}(hhh]h)}(hopen a tty deviceh]hopen a tty device}(hjZGhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjWGhhubah}(h]h ]h"]h$]h&]uh1jhjFhhhj8FhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjrGjjrGjjjuh1jhhhj:hNhNubj)}(hXV**Parameters** ``struct inode *inode`` inode of device file ``struct file *filp`` file pointer to tty **Description** tty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty. Open-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92) The termios state of a pty is reset on the first open so that settings don't persist across reuse. Locking: * ``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev(). * **tty->count** should protect the rest. * ->siglock protects ->signal/->sighand **Note** the tty_unlock/lock cases without a ref are only safe due to ``tty_mutex``h](h)}(h**Parameters**h]j)}(hj|Gh]h Parameters}(hj~GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzGubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjvGubj)}(hhh](j)}(h-``struct inode *inode`` inode of device file h](j)}(h``struct inode *inode``h]j)}(hjGh]hstruct inode *inode}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjGubj)}(hhh]h)}(hinode of device fileh]hinode of device file}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjGubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjGh]hstruct file *filp}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjGubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhM hjGubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjGhM hjGubeh}(h]h ]h"]h$]h&]uh1jhjvGubh)}(h**Description**h]j)}(hjHh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Hubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjvGubh)}(htty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty.h]htty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty.}(hj%HhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjvGubh)}(hOpen-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92)h]hOpen-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92)}(hj4HhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjvGubh)}(hbThe termios state of a pty is reset on the first open so that settings don't persist across reuse.h]hdThe termios state of a pty is reset on the first open so that settings don’t persist across reuse.}(hjCHhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjvGubj)}(hhh]j)}(hLocking: * ``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev(). * **tty->count** should protect the rest. * ->siglock protects ->signal/->sighand h](j)}(hLocking:h]hLocking:}(hjYHhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjUHubj)}(hhh]h)}(hhh](h)}(hC``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev().h]h)}(hjpHh](j)}(h ``tty_mutex``h]h tty_mutex}(hjuHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrHubh6 protects tty, tty_lookup_driver() and tty_init_dev().}(hjrHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjnHubah}(h]h ]h"]h$]h&]uh1hhjkHubh)}(h'**tty->count** should protect the rest.h]h)}(hjHh](j)}(h**tty->count**h]h tty->count}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh should protect the rest.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjHubah}(h]h ]h"]h$]h&]uh1hhjkHubh)}(h&->siglock protects ->signal/->sighand h]h)}(h%->siglock protects ->signal/->sighandh]h%->siglock protects ->signal/->sighand}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgHhMhjHubah}(h]h ]h"]h$]h&]uh1hhjkHubeh}(h]h ]h"]h$]h&]jzjPuh1hhjHhMhjhHubah}(h]h ]h"]h$]h&]uh1jhjUHubeh}(h]h ]h"]h$]h&]uh1jhjgHhMhjRHubah}(h]h ]h"]h$]h&]uh1jhjvGubh)}(h**Note**h]j)}(hjHh]hNote}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjvGubh)}(hJthe tty_unlock/lock cases without a ref are only safe due to ``tty_mutex``h](h=the tty_unlock/lock cases without a ref are only safe due to }(hjIhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hj IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjvGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_poll (C function) c.tty_pollhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h7__poll_t tty_poll (struct file *filp, poll_table *wait)h]j)}(h6__poll_t tty_poll(struct file *filp, poll_table *wait)h](h)}(hhh]j)}(h__poll_th]h__poll_t}(hjBIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?Iubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjDImodnameN classnameNj0j3)}j6]j9)}j,tty_pollsb c.tty_pollasbuh1hhj;Ihhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMeubj)}(h h]h }(hjdIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;IhhhjcIhMeubj)}(htty_pollh]j)}(hj`Ih]htty_poll}(hjvIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrIubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;IhhhjcIhMeubj)}(h%(struct file *filp, poll_table *wait)h](j)}(hstruct file *filph](j)}(hjh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubh)}(hhh]j)}(hfileh]hfile}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjImodnameN classnameNj0j3)}j6]j^I c.tty_pollasbuh1hhjIubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubjM)}(hjPh]h*}(hjIhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjIubj)}(hfilph]hfilp}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjIubj)}(hpoll_table *waith](h)}(hhh]j)}(h poll_tableh]h poll_table}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjJmodnameN classnameNj0j3)}j6]j^I c.tty_pollasbuh1hhjIubj)}(h h]h }(hj"JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubjM)}(hjPh]h*}(hj0JhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjIubj)}(hwaith]hwait}(hj=JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjIubeh}(h]h ]h"]h$]h&]hhuh1jhj;IhhhjcIhMeubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj7IhhhjcIhMeubah}(h]j2Iah ](jjeh"]h$]h&]jj)jhuh1jhjcIhMehj4Ihhubj)}(hhh]h)}(hcheck tty statush]hcheck tty status}(hjgJhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMehjdJhhubah}(h]h ]h"]h$]h&]uh1jhj4IhhhjcIhMeubeh}(h]h ](j*functioneh"]h$]h&]jj*jjJjjJjjjuh1jhhhj:hNhNubj)}(hX;**Parameters** ``struct file *filp`` file being polled ``poll_table *wait`` poll wait structures to update **Description** Call the line discipline polling method to obtain the poll status of the device. Locking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMihjJubj)}(hhh](j)}(h(``struct file *filp`` file being polled h](j)}(h``struct file *filp``h]j)}(hjJh]hstruct file *filp}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMfhjJubj)}(hhh]h)}(hfile being polledh]hfile being polled}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMfhjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMfhjJubj)}(h4``poll_table *wait`` poll wait structures to update h](j)}(h``poll_table *wait``h]j)}(hjJh]hpoll_table *wait}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMghjJubj)}(hhh]h)}(hpoll wait structures to updateh]hpoll wait structures to update}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMghjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMghjJubeh}(h]h ]h"]h$]h&]uh1jhjJubh)}(h**Description**h]j)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMihjJubh)}(hPCall the line discipline polling method to obtain the poll status of the device.h]hPCall the line discipline polling method to obtain the poll status of the device.}(hj2KhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhhjJubh)}(hfLocking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.h]hfLocking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.}(hjAKhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMkhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtiocsti (C function) c.tiocstihNtauh1jhj:hhhNhNubj)}(hhh](j)}(h2int tiocsti (struct tty_struct *tty, u8 __user *p)h]j)}(h1int tiocsti(struct tty_struct *tty, u8 __user *p)h](j)}(hinth]hint}(hjpKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlKhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlKhhhj~KhMubj)}(htiocstih]j)}(htiocstih]htiocsti}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]hhuh1jhjlKhhhj~KhMubj)}(h&(struct tty_struct *tty, u8 __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjKmodnameN classnameNj0j3)}j6]j9)}j,jKsb c.tiocstiasbuh1hhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubjM)}(hjPh]h*}(hjKhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjKubj)}(httyh]htty}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjKubj)}(h u8 __user *ph](h)}(hhh]j)}(hu8h]hu8}(hj"LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj$LmodnameN classnameNj0j3)}j6]jK c.tiocstiasbuh1hhjLubj)}(h h]h }(hj@LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh__user}(hjLhhhNhNubj)}(h h]h }(hjRLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubjM)}(hjPh]h*}(hj`LhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjLubj)}(hjYh]hp}(hjmLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjKubeh}(h]h ]h"]h$]h&]hhuh1jhjlKhhhj~KhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjhKhhhj~KhMubah}(h]jcKah ](jjeh"]h$]h&]jj)jhuh1jhj~KhMhjeKhhubj)}(hhh]h)}(hfake input characterh]hfake input character}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLhhubah}(h]h ]h"]h$]h&]uh1jhjeKhhhj~KhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jjLjjLjjjuh1jhhhj:hNhNubj)}(hXZ**Parameters** ``struct tty_struct *tty`` tty to fake input into ``u8 __user *p`` pointer to character **Description** Fake input to a tty device. Does the necessary locking and input management. FIXME: does not honour flow control ?? Locking: * Called functions take tty_ldiscs_lock * current->signal->tty check is safe without locksh](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh](j)}(h2``struct tty_struct *tty`` tty to fake input into h](j)}(h``struct tty_struct *tty``h]j)}(hjLh]hstruct tty_struct *tty}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh]h)}(htty to fake input intoh]htty to fake input into}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjLubj)}(h&``u8 __user *p`` pointer to character h](j)}(h``u8 __user *p``h]j)}(hjMh]h u8 __user *p}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj Mubj)}(hhh]h)}(hpointer to characterh]hpointer to character}(hj)MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%MhMhj&Mubah}(h]h ]h"]h$]h&]uh1jhj Mubeh}(h]h ]h"]h$]h&]uh1jhj%MhMhjLubeh}(h]h ]h"]h$]h&]uh1jhjLubh)}(h**Description**h]j)}(hjKMh]h Description}(hjMMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIMubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubh)}(hLFake input to a tty device. Does the necessary locking and input management.h]hLFake input to a tty device. Does the necessary locking and input management.}(hjaMhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubh)}(h&FIXME: does not honour flow control ??h]h&FIXME: does not honour flow control ??}(hjpMhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh]j)}(hcLocking: * Called functions take tty_ldiscs_lock * current->signal->tty check is safe without locksh](j)}(hLocking:h]hLocking:}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjMubj)}(hhh]h)}(hhh](h)}(h%Called functions take tty_ldiscs_lockh]h)}(hjMh]h%Called functions take tty_ldiscs_lock}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1hhjMubh)}(h0current->signal->tty check is safe without locksh]h)}(hjMh]h0current->signal->tty check is safe without locks}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjMubah}(h]h ]h"]h$]h&]uh1hhjMubeh}(h]h ]h"]h$]h&]jzjPuh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtiocgwinsz (C function) c.tiocgwinszhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hCint tiocgwinsz (struct tty_struct *tty, struct winsize __user *arg)h]j)}(hBint tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hinth]hint}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhjNhMubj)}(h tiocgwinszh]j)}(h tiocgwinszh]h tiocgwinsz}(hj#NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]hhuh1jhjMhhhjNhMubj)}(h4(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj?NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Nubj)}(h h]h }(hjLNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Nubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj]NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZNubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj_NmodnameN classnameNj0j3)}j6]j9)}j,j%Nsb c.tiocgwinszasbuh1hhj;Nubj)}(h h]h }(hj}NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;NubjM)}(hjPh]h*}(hjNhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj;Nubj)}(httyh]htty}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Nubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj7Nubj)}(hstruct winsize __user *argh](j)}(hjh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubh)}(hhh]j)}(hwinsizeh]hwinsize}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjNmodnameN classnameNj0j3)}j6]jyN c.tiocgwinszasbuh1hhjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubh__user}(hjNhhhNhNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubjM)}(hjPh]h*}(hj OhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjNubj)}(hargh]harg}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj7Nubeh}(h]h ]h"]h$]h&]hhuh1jhjMhhhjNhMubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjMhhhjNhMubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jhjNhMhjMhhubj)}(hhh]h)}(himplement window query ioctlh]himplement window query ioctl}(hjDOhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjAOhhubah}(h]h ]h"]h$]h&]uh1jhjMhhhjNhMubeh}(h]h ](j*functioneh"]h$]h&]jj*jj\Ojj\Ojjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` tty ``struct winsize __user *arg`` user buffer for result **Description** Copies the kernel idea of the window size into the user buffer. Locking: **tty->winsize_mutex** is taken to ensure the winsize data is consistent.h](h)}(h**Parameters**h]j)}(hjfOh]h Parameters}(hjhOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdOubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj`Oubj)}(hhh](j)}(h``struct tty_struct *tty`` tty h](j)}(h``struct tty_struct *tty``h]j)}(hjOh]hstruct tty_struct *tty}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjOubj)}(hhh]h)}(httyh]htty}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj|Oubj)}(h6``struct winsize __user *arg`` user buffer for result h](j)}(h``struct winsize __user *arg``h]j)}(hjOh]hstruct winsize __user *arg}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjOubj)}(hhh]h)}(huser buffer for resulth]huser buffer for result}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj|Oubeh}(h]h ]h"]h$]h&]uh1jhj`Oubh)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj`Oubh)}(h?Copies the kernel idea of the window size into the user buffer.h]h?Copies the kernel idea of the window size into the user buffer.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj`Oubh)}(hRLocking: **tty->winsize_mutex** is taken to ensure the winsize data is consistent.h](h Locking: }(hjPhhhNhNubj)}(h**tty->winsize_mutex**h]htty->winsize_mutex}(hj&PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh3 is taken to ensure the winsize data is consistent.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj`Oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtiocswinsz (C function) c.tiocswinszhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hCint tiocswinsz (struct tty_struct *tty, struct winsize __user *arg)h]j)}(hBint tiocswinsz(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hinth]hint}(hj_PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Phhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjnPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[PhhhjmPhM ubj)}(h tiocswinszh]j)}(h tiocswinszh]h tiocswinsz}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|Pubah}(h]h ](jjeh"]h$]h&]hhuh1jhj[PhhhjmPhM ubj)}(h4(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjPmodnameN classnameNj0j3)}j6]j9)}j,jPsb c.tiocswinszasbuh1hhjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubjM)}(hjPh]h*}(hjPhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjPubj)}(httyh]htty}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPubj)}(hstruct winsize __user *argh](j)}(hjh]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Qubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Qubh)}(hhh]j)}(hwinsizeh]hwinsize}(hj,QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)Qubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj.QmodnameN classnameNj0j3)}j6]jP c.tiocswinszasbuh1hhj Qubj)}(h h]h }(hjJQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Qubh__user}(hj QhhhNhNubj)}(h h]h }(hj\QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj QubjM)}(hjPh]h*}(hjjQhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj Qubj)}(hargh]harg}(hjwQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Qubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPubeh}(h]h ]h"]h$]h&]hhuh1jhj[PhhhjmPhM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjWPhhhjmPhM ubah}(h]jRPah ](jjeh"]h$]h&]jj)jhuh1jhjmPhM hjTPhhubj)}(hhh]h)}(himplement window size set ioctlh]himplement window size set ioctl}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQhhubah}(h]h ]h"]h$]h&]uh1jhjTPhhhjmPhM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjQjjQjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` tty side of tty ``struct winsize __user *arg`` user buffer for result **Description** Copies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize. Locking: Driver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h](h)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubj)}(hhh](j)}(h+``struct tty_struct *tty`` tty side of tty h](j)}(h``struct tty_struct *tty``h]j)}(hjQh]hstruct tty_struct *tty}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubj)}(hhh]h)}(htty side of ttyh]htty side of tty}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhM hjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhM hjQubj)}(h6``struct winsize __user *arg`` user buffer for result h](j)}(h``struct winsize __user *arg``h]j)}(hjRh]hstruct winsize __user *arg}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjRubj)}(hhh]h)}(huser buffer for resulth]huser buffer for result}(hj4RhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0RhM hj1Rubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhj0RhM hjQubeh}(h]h ]h"]h$]h&]uh1jhjQubh)}(h**Description**h]j)}(hjVRh]h Description}(hjXRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTRubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubh)}(hCopies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize.h]hCopies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize.}(hjlRhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubj)}(hhh]j)}(hLocking: Driver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h](j)}(hLocking:h]hLocking:}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj~Rubj)}(hhh]h)}(hDriver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h]hDriver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjRubah}(h]h ]h"]h$]h&]uh1jhj~Rubeh}(h]h ]h"]h$]h&]uh1jhjRhM hj{Rubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtioccons (C function) c.tiocconshNtauh1jhj:hhhNhNubj)}(hhh](j)}(h int tioccons (struct file *file)h]j)}(hint tioccons(struct file *file)h](j)}(hinth]hint}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM* ubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjRhM* ubj)}(htiocconsh]j)}(htiocconsh]htioccons}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]hhuh1jhjRhhhjRhM* ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(hfileh]hfile}(hj0ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Subah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj2SmodnameN classnameNj0j3)}j6]j9)}j,jRsb c.tiocconsasbuh1hhjSubj)}(h h]h }(hjPShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjM)}(hjPh]h*}(hj^ShhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjSubj)}(hfileh]hfile}(hjkShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj Subah}(h]h ]h"]h$]h&]hhuh1jhjRhhhjRhM* ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjRhhhjRhM* ubah}(h]jRah ](jjeh"]h$]h&]jj)jhuh1jhjRhM* hjRhhubj)}(hhh]h)}(h#allow admin to move logical consoleh]h#allow admin to move logical console}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM* hjShhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjRhM* ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjSjjSjjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct file *file`` the file to become console **Description** Allow the administrator to move the redirected console device. Locking: uses redirect_lock to guard the redirect informationh](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM. hjSubj)}(hhh]j)}(h1``struct file *file`` the file to become console h](j)}(h``struct file *file``h]j)}(hjSh]hstruct file *file}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+ hjSubj)}(hhh]h)}(hthe file to become consoleh]hthe file to become console}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM+ hjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShM+ hjSubah}(h]h ]h"]h$]h&]uh1jhjSubh)}(h**Description**h]j)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM- hjSubh)}(h>Allow the administrator to move the redirected console device.h]h>Allow the administrator to move the redirected console device.}(hj'ThhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM, hjSubh)}(h=Locking: uses redirect_lock to guard the redirect informationh]h=Locking: uses redirect_lock to guard the redirect information}(hj6ThhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM. hjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtiocsetd (C function) c.tiocsetdhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h4int tiocsetd (struct tty_struct *tty, int __user *p)h]j)}(h3int tiocsetd(struct tty_struct *tty, int __user *p)h](j)}(hinth]hint}(hjeThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaThhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMR ubj)}(h h]h }(hjtThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaThhhjsThMR ubj)}(htiocsetdh]j)}(htiocsetdh]htiocsetd}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]hhuh1jhjaThhhjsThMR ubj)}(h'(struct tty_struct *tty, int __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetjTmodnameN classnameNj0j3)}j6]j9)}j,jTsb c.tiocsetdasbuh1hhjTubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubjM)}(hjPh]h*}(hjThhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjTubj)}(httyh]htty}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjTubj)}(h int __user *ph](j)}(hinth]hint}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h h]h }(hj"UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubh__user}(hjUhhhNhNubj)}(h h]h }(hj4UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubjM)}(hjPh]h*}(hjBUhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjUubj)}(hjYh]hp}(hjOUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjTubeh}(h]h ]h"]h$]h&]hhuh1jhjaThhhjsThMR ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj]ThhhjsThMR ubah}(h]jXTah ](jjeh"]h$]h&]jj)jhuh1jhjsThMR hjZThhubj)}(hhh]h)}(hset line disciplineh]hset line discipline}(hjxUhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMR hjuUhhubah}(h]h ]h"]h$]h&]uh1jhjZThhhjsThMR ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjUjjUjjjuh1jhhhj:hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device ``int __user *p`` pointer to user data **Description** Set the line discipline according to user request. Locking: see tty_set_ldisc(), this function is just a helperh](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMV hjUubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjUh]hstruct tty_struct *tty}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMS hjUubj)}(hhh]h)}(h tty deviceh]h tty device}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMS hjUubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMS hjUubj)}(h'``int __user *p`` pointer to user data h](j)}(h``int __user *p``h]j)}(hjUh]h int __user *p}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMT hjUubj)}(hhh]h)}(hpointer to user datah]hpointer to user data}(hj VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMT hjVubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjVhMT hjUubeh}(h]h ]h"]h$]h&]uh1jhjUubh)}(h**Description**h]j)}(hj-Vh]h Description}(hj/VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Vubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMV hjUubh)}(h2Set the line discipline according to user request.h]h2Set the line discipline according to user request.}(hjCVhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMU hjUubh)}(hWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Wubh__user}(hj,WhhhNhNubj)}(h h]h }(hjPWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,WubjM)}(hjPh]h*}(hj^WhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj,Wubj)}(hjYh]hp}(hjkWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Wubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjVubeh}(h]h ]h"]h$]h&]hhuh1jhj}VhhhjVhMh ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjyVhhhjVhMh ubah}(h]jtVah ](jjeh"]h$]h&]jj)jhuh1jhjVhMh hjvVhhubj)}(hhh]h)}(hget line disciplineh]hget line discipline}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMh hjWhhubah}(h]h ]h"]h$]h&]uh1jhjvVhhhjVhMh ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjWjjWjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` tty device ``int __user *p`` pointer to user data **Description** Retrieves the line discipline id directly from the ldisc. Locking: waits for ldisc reference (in case the line discipline is changing or the **tty** is being hungup)h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMl hjWubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjWh]hstruct tty_struct *tty}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMi hjWubj)}(hhh]h)}(h tty deviceh]h tty device}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMi hjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMi hjWubj)}(h'``int __user *p`` pointer to user data h](j)}(h``int __user *p``h]j)}(hjXh]h int __user *p}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Xubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMj hjXubj)}(hhh]h)}(hpointer to user datah]hpointer to user data}(hj'XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#XhMj hj$Xubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhj#XhMj hjWubeh}(h]h ]h"]h$]h&]uh1jhjWubh)}(h**Description**h]j)}(hjIXh]h Description}(hjKXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGXubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMl hjWubh)}(h9Retrieves the line discipline id directly from the ldisc.h]h9Retrieves the line discipline id directly from the ldisc.}(hj_XhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMk hjWubh)}(hkLocking: waits for ldisc reference (in case the line discipline is changing or the **tty** is being hungup)h](hSLocking: waits for ldisc reference (in case the line discipline is changing or the }(hjnXhhhNhNubj)}(h**tty**h]htty}(hjvXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnXubh is being hungup)}(hjnXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMm hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jsend_break (C function) c.send_breakhNtauh1jhj:hhhNhNubj)}(hhh](j)}(h>int send_break (struct tty_struct *tty, unsigned int duration)h]j)}(h=int send_break(struct tty_struct *tty, unsigned int duration)h](j)}(hinth]hint}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhjXhM ubj)}(h send_breakh]j)}(h send_breakh]h send_break}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ](jjeh"]h$]h&]hhuh1jhjXhhhjXhM ubj)}(h/(struct tty_struct *tty, unsigned int duration)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj YmodnameN classnameNj0j3)}j6]j9)}j,jXsb c.send_breakasbuh1hhjXubj)}(h h]h }(hj*YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjM)}(hjPh]h*}(hj8YhhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhjXubj)}(httyh]htty}(hjEYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjXubj)}(hunsigned int durationh](j)}(hunsignedh]hunsigned}(hj^YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZYubj)}(h h]h }(hjlYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZYubj)}(hinth]hint}(hjzYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZYubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZYubj)}(hdurationh]hduration}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZYubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjXubeh}(h]h ]h"]h$]h&]hhuh1jhjXhhhjXhM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjXhhhjXhM ubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jhjXhM hjXhhubj)}(hhh]h)}(hperformed time breakh]hperformed time break}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjYhhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjXhM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jjYjjYjjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` device to break on ``unsigned int duration`` timeout in mS **Description** Perform a timed break on hardware that lacks its own driver level timed break functionality. Locking: **tty->atomic_write_lock** serializesh](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjYubj)}(hhh](j)}(h.``struct tty_struct *tty`` device to break on h](j)}(h``struct tty_struct *tty``h]j)}(hjZh]hstruct tty_struct *tty}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjYubj)}(hhh]h)}(hdevice to break onh]hdevice to break on}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhM hjZubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjZhM hjYubj)}(h(``unsigned int duration`` timeout in mS h](j)}(h``unsigned int duration``h]j)}(hj:Zh]hunsigned int duration}(hjatomic_write_lock** serializesh](j)}(hLocking:h]hLocking:}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjZubj)}(hhh]h)}(h%**tty->atomic_write_lock** serializesh](j)}(h**tty->atomic_write_lock**h]htty->atomic_write_lock}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubh serializes}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhM hjZubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_tiocmget (C function)c.tty_tiocmgethNtauh1jhj:hhhNhNubj)}(hhh](j)}(h8int tty_tiocmget (struct tty_struct *tty, int __user *p)h]j)}(h7int tty_tiocmget(struct tty_struct *tty, int __user *p)h](j)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhj[hM ubj)}(h tty_tiocmgeth]j)}(h tty_tiocmgeth]h tty_tiocmget}(hj#[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjZhhhj[hM ubj)}(h'(struct tty_struct *tty, int __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj?[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;[ubj)}(h h]h }(hjL[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;[ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj][hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ[ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj_[modnameN classnameNj0j3)}j6]j9)}j,j%[sbc.tty_tiocmgetasbuh1hhj;[ubj)}(h h]h }(hj}[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;[ubjM)}(hjPh]h*}(hj[hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj;[ubj)}(httyh]htty}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;[ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj7[ubj)}(h int __user *ph](j)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubh__user}(hj[hhhNhNubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubjM)}(hjPh]h*}(hj[hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj[ubj)}(hjYh]hp}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj7[ubeh}(h]h ]h"]h$]h&]hhuh1jhjZhhhj[hM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhjZhhhj[hM ubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1jhj[hM hjZhhubj)}(hhh]h)}(hget modem statush]hget modem status}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj\hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhj[hM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj-\jj-\jjjuh1jhhhj:hNhNubj)}(hX **Parameters** ``struct tty_struct *tty`` tty device ``int __user *p`` pointer to result **Description** Obtain the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hj7\h]h Parameters}(hj9\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5\ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj1\ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjV\h]hstruct tty_struct *tty}(hjX\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT\ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjP\ubj)}(hhh]h)}(h tty deviceh]h tty device}(hjo\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk\hM hjl\ubah}(h]h ]h"]h$]h&]uh1jhjP\ubeh}(h]h ]h"]h$]h&]uh1jhjk\hM hjM\ubj)}(h$``int __user *p`` pointer to result h](j)}(h``int __user *p``h]j)}(hj\h]h int __user *p}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj\ubj)}(hhh]h)}(hpointer to resulth]hpointer to result}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hjM\ubeh}(h]h ]h"]h$]h&]uh1jhj1\ubh)}(h**Description**h]j)}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj1\ubh)}(hxObtain the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available.h](hVObtain the modem status bits from the tty driver if the feature is supported. Return -}(hj\hhhNhNubj)}(h ``ENOTTY``h]hENOTTY}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh if it is not available.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj1\ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj1\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_tiocmset (C function)c.tty_tiocmsethNtauh1jhj:hhhNhNubj)}(hhh](j)}(hOint tty_tiocmset (struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h]j)}(hNint tty_tiocmset(struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h](j)}(hinth]hint}(hj0]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,]hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj?]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,]hhhj>]hM ubj)}(h tty_tiocmseth]j)}(h tty_tiocmseth]h tty_tiocmset}(hjQ]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM]ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,]hhhj>]hM ubj)}(h>(struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjm]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji]ubj)}(h h]h }(hjz]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji]ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj]modnameN classnameNj0j3)}j6]j9)}j,jS]sbc.tty_tiocmsetasbuh1hhji]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji]ubjM)}(hjPh]h*}(hj]hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhji]ubj)}(httyh]htty}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhje]ubj)}(hunsigned int cmdh](j)}(hunsignedh]hunsigned}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hinth]hint}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(h h]h }(hj ^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hcmdh]hcmd}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhje]ubj)}(hunsigned __user *ph](j)}(hunsignedh]hunsigned}(hj0^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,^ubj)}(h h]h }(hj>^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,^ubh__user}(hj,^hhhNhNubj)}(h h]h }(hjP^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,^ubjM)}(hjPh]h*}(hj^^hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj,^ubj)}(hjYh]hp}(hjk^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,^ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhje]ubeh}(h]h ]h"]h$]h&]hhuh1jhj,]hhhj>]hM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj(]hhhj>]hM ubah}(h]j#]ah ](jjeh"]h$]h&]jj)jhuh1jhj>]hM hj%]hhubj)}(hhh]h)}(hset modem statush]hset modem status}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^hhubah}(h]h ]h"]h$]h&]uh1jhj%]hhhj>]hM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj^jj^jjjuh1jhhhj:hNhNubj)}(hXU**Parameters** ``struct tty_struct *tty`` tty device ``unsigned int cmd`` command - clear bits, set bits or set all ``unsigned __user *p`` pointer to desired bits **Description** Set the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hj^h]hstruct tty_struct *tty}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubj)}(hhh]h)}(h tty deviceh]h tty device}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM hj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM hj^ubj)}(h?``unsigned int cmd`` command - clear bits, set bits or set all h](j)}(h``unsigned int cmd``h]j)}(hj_h]hunsigned int cmd}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj _ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj_ubj)}(hhh]h)}(h)command - clear bits, set bits or set allh]h)command - clear bits, set bits or set all}(hj'_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#_hM hj$_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj#_hM hj^ubj)}(h/``unsigned __user *p`` pointer to desired bits h](j)}(h``unsigned __user *p``h]j)}(hjG_h]hunsigned __user *p}(hjI_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE_ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjA_ubj)}(hhh]h)}(hpointer to desired bitsh]hpointer to desired bits}(hj`_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\_hM hj]_ubah}(h]h ]h"]h$]h&]uh1jhjA_ubeh}(h]h ]h"]h$]h&]uh1jhj\_hM hj^ubeh}(h]h ]h"]h$]h&]uh1jhj^ubh)}(h**Description**h]j)}(hj_h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubh)}(huSet the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available.h](hSSet the modem status bits from the tty driver if the feature is supported. Return -}(hj_hhhNhNubj)}(h ``ENOTTY``h]hENOTTY}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh if it is not available.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj:hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jalloc_tty_struct (C function)c.alloc_tty_structhNtauh1jhj:hhhNhNubj)}(hhh](j)}(hIstruct tty_struct * alloc_tty_struct (struct tty_driver *driver, int idx)h]j)}(hGstruct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)h](j)}(hjh]hstruct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhj_hM ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj `modnameN classnameNj0j3)}j6]j9)}j,alloc_tty_structsbc.alloc_tty_structasbuh1hhj_hhhj_hM ubj)}(h h]h }(hj(`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhj_hM ubjM)}(hjPh]h*}(hj6`hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj_hhhj_hM ubj)}(halloc_tty_structh]j)}(hj%`h]halloc_tty_struct}(hjG`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC`ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj_hhhj_hM ubj)}(h$(struct tty_driver *driver, int idx)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hjb`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^`ubj)}(h h]h }(hjo`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^`ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}`ubah}(h]h ]h"]h$]h&] refdomainj*reftypej, reftargetj`modnameN classnameNj0j3)}j6]j#`c.alloc_tty_structasbuh1hhj^`ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^`ubjM)}(hjPh]h*}(hj`hhhNhNubah}(h]h ]jYah"]h$]h&]uh1jLhj^`ubj)}(hdriverh]hdriver}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^`ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjZ`ubj)}(hint idxh](j)}(hinth]hint}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hidxh]hidx}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjZ`ubeh}(h]h ]h"]h$]h&]hhuh1jhj_hhhj_hM ubeh}(h]h ]h"]h$]h&]hhj~uh1jjjhj_hhhj_hM ubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhj_hM hj_hhubj)}(hhh]h)}(hallocate a new ttyh]hallocate a new tty}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjahhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj_hM ubeh}(h]h ](j*functioneh"]h$]h&]jj*jj0ajj0ajjjuh1jhhhj:hNhNubj)}(hX**Parameters** ``struct tty_driver *driver`` driver which will handle the returned tty ``int idx`` minor of the tty **Description** This subroutine allocates and initializes a tty structure. Locking: none - **tty** in question is not exposed at this pointh](h)}(h**Parameters**h]j)}(hj:ah]h Parameters}(hj