diff options
| author | David Miller <davem@davemloft.net> | 2007-10-17 22:38:10 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2007-10-17 22:38:10 -0400 |
| commit | 6050afbbb01d1f5a867f7839be6460bac801f5bc (patch) | |
| tree | 022be422a8b28f7b630cf20e8b7674b2dfcc9cfc | |
| parent | 4209ab098c61b1a9684bb4d3fc287352fc2438c3 (diff) | |
[SPARC]: Support for new termios.
[akpm@linux-foundation.org: coding-style tweaks]
Signed-off-by: David Miller <davem@davemloft.net>
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/asm-sparc/ioctls.h | 4 | ||||
| -rw-r--r-- | include/asm-sparc/termbits.h | 15 | ||||
| -rw-r--r-- | include/asm-sparc/termios.h | 48 | ||||
| -rw-r--r-- | include/asm-sparc64/ioctls.h | 4 | ||||
| -rw-r--r-- | include/asm-sparc64/termbits.h | 17 | ||||
| -rw-r--r-- | include/asm-sparc64/termios.h | 42 |
6 files changed, 125 insertions, 5 deletions
diff --git a/include/asm-sparc/ioctls.h b/include/asm-sparc/ioctls.h index bdf77b0dfd8e..058c2064f706 100644 --- a/include/asm-sparc/ioctls.h +++ b/include/asm-sparc/ioctls.h | |||
| @@ -15,6 +15,10 @@ | |||
| 15 | #define TCSETS _IOW('T', 9, struct termios) | 15 | #define TCSETS _IOW('T', 9, struct termios) |
| 16 | #define TCSETSW _IOW('T', 10, struct termios) | 16 | #define TCSETSW _IOW('T', 10, struct termios) |
| 17 | #define TCSETSF _IOW('T', 11, struct termios) | 17 | #define TCSETSF _IOW('T', 11, struct termios) |
| 18 | #define TCGETS2 _IOR('T', 12, struct termios2) | ||
| 19 | #define TCSETS2 _IOW('T', 13, struct termios2) | ||
| 20 | #define TCSETSW2 _IOW('T', 14, struct termios2) | ||
| 21 | #define TCSETSF2 _IOW('T', 15, struct termios2) | ||
| 18 | 22 | ||
| 19 | /* Note that all the ioctls that are not available in Linux have a | 23 | /* Note that all the ioctls that are not available in Linux have a |
| 20 | * double underscore on the front to: a) avoid some programs to | 24 | * double underscore on the front to: a) avoid some programs to |
diff --git a/include/asm-sparc/termbits.h b/include/asm-sparc/termbits.h index 5eb00a105d7c..90cf2210118b 100644 --- a/include/asm-sparc/termbits.h +++ b/include/asm-sparc/termbits.h | |||
| @@ -31,6 +31,18 @@ struct termios { | |||
| 31 | #endif | 31 | #endif |
| 32 | }; | 32 | }; |
| 33 | 33 | ||
| 34 | struct termios2 { | ||
| 35 | tcflag_t c_iflag; /* input mode flags */ | ||
| 36 | tcflag_t c_oflag; /* output mode flags */ | ||
| 37 | tcflag_t c_cflag; /* control mode flags */ | ||
| 38 | tcflag_t c_lflag; /* local mode flags */ | ||
| 39 | cc_t c_line; /* line discipline */ | ||
| 40 | cc_t c_cc[NCCS]; /* control characters */ | ||
| 41 | cc_t _x_cc[2]; /* padding to match ktermios */ | ||
| 42 | speed_t c_ispeed; /* input speed */ | ||
| 43 | speed_t c_ospeed; /* output speed */ | ||
| 44 | }; | ||
| 45 | |||
| 34 | struct ktermios { | 46 | struct ktermios { |
| 35 | tcflag_t c_iflag; /* input mode flags */ | 47 | tcflag_t c_iflag; /* input mode flags */ |
| 36 | tcflag_t c_oflag; /* output mode flags */ | 48 | tcflag_t c_oflag; /* output mode flags */ |
| @@ -160,6 +172,7 @@ struct ktermios { | |||
| 160 | #define CLOCAL 0x00000800 | 172 | #define CLOCAL 0x00000800 |
| 161 | #define CBAUDEX 0x00001000 | 173 | #define CBAUDEX 0x00001000 |
| 162 | /* We'll never see these speeds with the Zilogs, but for completeness... */ | 174 | /* We'll never see these speeds with the Zilogs, but for completeness... */ |
| 175 | #define BOTHER 0x00001000 | ||
| 163 | #define B57600 0x00001001 | 176 | #define B57600 0x00001001 |
| 164 | #define B115200 0x00001002 | 177 | #define B115200 0x00001002 |
| 165 | #define B230400 0x00001003 | 178 | #define B230400 0x00001003 |
| @@ -189,6 +202,8 @@ struct ktermios { | |||
| 189 | #define CMSPAR 0x40000000 /* mark or space (stick) parity */ | 202 | #define CMSPAR 0x40000000 /* mark or space (stick) parity */ |
| 190 | #define CRTSCTS 0x80000000 /* flow control */ | 203 | #define CRTSCTS 0x80000000 /* flow control */ |
| 191 | 204 | ||
| 205 | #define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ | ||
| 206 | |||
| 192 | /* c_lflag bits */ | 207 | /* c_lflag bits */ |
| 193 | #define ISIG 0x00000001 | 208 | #define ISIG 0x00000001 |
| 194 | #define ICANON 0x00000002 | 209 | #define ICANON 0x00000002 |
diff --git a/include/asm-sparc/termios.h b/include/asm-sparc/termios.h index d767f206ab33..4333232abb9f 100644 --- a/include/asm-sparc/termios.h +++ b/include/asm-sparc/termios.h | |||
| @@ -108,13 +108,55 @@ struct winsize { | |||
| 108 | 108 | ||
| 109 | #define user_termios_to_kernel_termios(k, u) \ | 109 | #define user_termios_to_kernel_termios(k, u) \ |
| 110 | ({ \ | 110 | ({ \ |
| 111 | int err; \ | ||
| 112 | err = get_user((k)->c_iflag, &(u)->c_iflag); \ | ||
| 113 | err |= get_user((k)->c_oflag, &(u)->c_oflag); \ | ||
| 114 | err |= get_user((k)->c_cflag, &(u)->c_cflag); \ | ||
| 115 | err |= get_user((k)->c_lflag, &(u)->c_lflag); \ | ||
| 116 | err |= get_user((k)->c_line, &(u)->c_line); \ | ||
| 117 | err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ | ||
| 118 | if ((k)->c_lflag & ICANON) { \ | ||
| 119 | err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | ||
| 120 | err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | ||
| 121 | } else { \ | ||
| 122 | err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | ||
| 123 | err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | ||
| 124 | } \ | ||
| 125 | err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \ | ||
| 126 | err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \ | ||
| 127 | err; \ | ||
| 128 | }) | ||
| 129 | |||
| 130 | #define kernel_termios_to_user_termios(u, k) \ | ||
| 131 | ({ \ | ||
| 132 | int err; \ | ||
| 133 | err = put_user((k)->c_iflag, &(u)->c_iflag); \ | ||
| 134 | err |= put_user((k)->c_oflag, &(u)->c_oflag); \ | ||
| 135 | err |= put_user((k)->c_cflag, &(u)->c_cflag); \ | ||
| 136 | err |= put_user((k)->c_lflag, &(u)->c_lflag); \ | ||
| 137 | err |= put_user((k)->c_line, &(u)->c_line); \ | ||
| 138 | err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ | ||
| 139 | if (!((k)->c_lflag & ICANON)) { \ | ||
| 140 | err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | ||
| 141 | err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | ||
| 142 | } else { \ | ||
| 143 | err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | ||
| 144 | err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | ||
| 145 | } \ | ||
| 146 | err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \ | ||
| 147 | err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \ | ||
| 148 | err; \ | ||
| 149 | }) | ||
| 150 | |||
| 151 | #define user_termios_to_kernel_termios_1(k, u) \ | ||
| 152 | ({ \ | ||
| 111 | get_user((k)->c_iflag, &(u)->c_iflag); \ | 153 | get_user((k)->c_iflag, &(u)->c_iflag); \ |
| 112 | get_user((k)->c_oflag, &(u)->c_oflag); \ | 154 | get_user((k)->c_oflag, &(u)->c_oflag); \ |
| 113 | get_user((k)->c_cflag, &(u)->c_cflag); \ | 155 | get_user((k)->c_cflag, &(u)->c_cflag); \ |
| 114 | get_user((k)->c_lflag, &(u)->c_lflag); \ | 156 | get_user((k)->c_lflag, &(u)->c_lflag); \ |
| 115 | get_user((k)->c_line, &(u)->c_line); \ | 157 | get_user((k)->c_line, &(u)->c_line); \ |
| 116 | copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ | 158 | copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ |
| 117 | if((k)->c_lflag & ICANON) { \ | 159 | if ((k)->c_lflag & ICANON) { \ |
| 118 | get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | 160 | get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ |
| 119 | get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | 161 | get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ |
| 120 | } else { \ | 162 | } else { \ |
| @@ -124,7 +166,7 @@ struct winsize { | |||
| 124 | 0; \ | 166 | 0; \ |
| 125 | }) | 167 | }) |
| 126 | 168 | ||
| 127 | #define kernel_termios_to_user_termios(u, k) \ | 169 | #define kernel_termios_to_user_termios_1(u, k) \ |
| 128 | ({ \ | 170 | ({ \ |
| 129 | put_user((k)->c_iflag, &(u)->c_iflag); \ | 171 | put_user((k)->c_iflag, &(u)->c_iflag); \ |
| 130 | put_user((k)->c_oflag, &(u)->c_oflag); \ | 172 | put_user((k)->c_oflag, &(u)->c_oflag); \ |
| @@ -132,7 +174,7 @@ struct winsize { | |||
| 132 | put_user((k)->c_lflag, &(u)->c_lflag); \ | 174 | put_user((k)->c_lflag, &(u)->c_lflag); \ |
| 133 | put_user((k)->c_line, &(u)->c_line); \ | 175 | put_user((k)->c_line, &(u)->c_line); \ |
| 134 | copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ | 176 | copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ |
| 135 | if(!((k)->c_lflag & ICANON)) { \ | 177 | if (!((k)->c_lflag & ICANON)) { \ |
| 136 | put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | 178 | put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ |
| 137 | put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | 179 | put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ |
| 138 | } else { \ | 180 | } else { \ |
diff --git a/include/asm-sparc64/ioctls.h b/include/asm-sparc64/ioctls.h index 2223b6d0e5ed..083c9a0f37de 100644 --- a/include/asm-sparc64/ioctls.h +++ b/include/asm-sparc64/ioctls.h | |||
| @@ -16,6 +16,10 @@ | |||
| 16 | #define TCSETS _IOW('T', 9, struct termios) | 16 | #define TCSETS _IOW('T', 9, struct termios) |
| 17 | #define TCSETSW _IOW('T', 10, struct termios) | 17 | #define TCSETSW _IOW('T', 10, struct termios) |
| 18 | #define TCSETSF _IOW('T', 11, struct termios) | 18 | #define TCSETSF _IOW('T', 11, struct termios) |
| 19 | #define TCGETS2 _IOR('T', 12, struct termios2) | ||
| 20 | #define TCSETS2 _IOW('T', 13, struct termios2) | ||
| 21 | #define TCSETSW2 _IOW('T', 14, struct termios2) | ||
| 22 | #define TCSETSF2 _IOW('T', 15, struct termios2) | ||
| 19 | 23 | ||
| 20 | /* Note that all the ioctls that are not available in Linux have a | 24 | /* Note that all the ioctls that are not available in Linux have a |
| 21 | * double underscore on the front to: a) avoid some programs to | 25 | * double underscore on the front to: a) avoid some programs to |
diff --git a/include/asm-sparc64/termbits.h b/include/asm-sparc64/termbits.h index 705cd44b4173..ebe31c152f16 100644 --- a/include/asm-sparc64/termbits.h +++ b/include/asm-sparc64/termbits.h | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | 5 | ||
| 6 | typedef unsigned char cc_t; | 6 | typedef unsigned char cc_t; |
| 7 | typedef unsigned int speed_t; | 7 | typedef unsigned int speed_t; |
| 8 | |||
| 9 | /* XXX is this right for sparc64? it was an unsigned long... XXX */ | ||
| 10 | typedef unsigned int tcflag_t; | 8 | typedef unsigned int tcflag_t; |
| 11 | 9 | ||
| 12 | #define NCC 8 | 10 | #define NCC 8 |
| @@ -33,6 +31,18 @@ struct termios { | |||
| 33 | #endif | 31 | #endif |
| 34 | }; | 32 | }; |
| 35 | 33 | ||
| 34 | struct termios2 { | ||
| 35 | tcflag_t c_iflag; /* input mode flags */ | ||
| 36 | tcflag_t c_oflag; /* output mode flags */ | ||
| 37 | tcflag_t c_cflag; /* control mode flags */ | ||
| 38 | tcflag_t c_lflag; /* local mode flags */ | ||
| 39 | cc_t c_line; /* line discipline */ | ||
| 40 | cc_t c_cc[NCCS]; /* control characters */ | ||
| 41 | cc_t _x_cc[2]; /* padding to match ktermios */ | ||
| 42 | speed_t c_ispeed; /* input speed */ | ||
| 43 | speed_t c_ospeed; /* output speed */ | ||
| 44 | }; | ||
| 45 | |||
| 36 | struct ktermios { | 46 | struct ktermios { |
| 37 | tcflag_t c_iflag; /* input mode flags */ | 47 | tcflag_t c_iflag; /* input mode flags */ |
| 38 | tcflag_t c_oflag; /* output mode flags */ | 48 | tcflag_t c_oflag; /* output mode flags */ |
| @@ -161,6 +171,7 @@ struct ktermios { | |||
| 161 | #define HUPCL 0x00000400 | 171 | #define HUPCL 0x00000400 |
| 162 | #define CLOCAL 0x00000800 | 172 | #define CLOCAL 0x00000800 |
| 163 | #define CBAUDEX 0x00001000 | 173 | #define CBAUDEX 0x00001000 |
| 174 | #define BOTHER 0x00001000 | ||
| 164 | #define B57600 0x00001001 | 175 | #define B57600 0x00001001 |
| 165 | #define B115200 0x00001002 | 176 | #define B115200 0x00001002 |
| 166 | #define B230400 0x00001003 | 177 | #define B230400 0x00001003 |
| @@ -190,6 +201,8 @@ struct ktermios { | |||
| 190 | #define CMSPAR 0x40000000 /* mark or space (stick) parity */ | 201 | #define CMSPAR 0x40000000 /* mark or space (stick) parity */ |
| 191 | #define CRTSCTS 0x80000000 /* flow control */ | 202 | #define CRTSCTS 0x80000000 /* flow control */ |
| 192 | 203 | ||
| 204 | #define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ | ||
| 205 | |||
| 193 | /* c_lflag bits */ | 206 | /* c_lflag bits */ |
| 194 | #define ISIG 0x00000001 | 207 | #define ISIG 0x00000001 |
| 195 | #define ICANON 0x00000002 | 208 | #define ICANON 0x00000002 |
diff --git a/include/asm-sparc64/termios.h b/include/asm-sparc64/termios.h index f05d390993d5..ef527211f8a8 100644 --- a/include/asm-sparc64/termios.h +++ b/include/asm-sparc64/termios.h | |||
| @@ -123,6 +123,8 @@ struct winsize { | |||
| 123 | err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | 123 | err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ |
| 124 | err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | 124 | err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ |
| 125 | } \ | 125 | } \ |
| 126 | err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \ | ||
| 127 | err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \ | ||
| 126 | err; \ | 128 | err; \ |
| 127 | }) | 129 | }) |
| 128 | 130 | ||
| @@ -142,6 +144,46 @@ struct winsize { | |||
| 142 | err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | 144 | err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ |
| 143 | err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | 145 | err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ |
| 144 | } \ | 146 | } \ |
| 147 | err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \ | ||
| 148 | err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \ | ||
| 149 | err; \ | ||
| 150 | }) | ||
| 151 | |||
| 152 | #define user_termios_to_kernel_termios_1(k, u) \ | ||
| 153 | ({ \ | ||
| 154 | int err; \ | ||
| 155 | err = get_user((k)->c_iflag, &(u)->c_iflag); \ | ||
| 156 | err |= get_user((k)->c_oflag, &(u)->c_oflag); \ | ||
| 157 | err |= get_user((k)->c_cflag, &(u)->c_cflag); \ | ||
| 158 | err |= get_user((k)->c_lflag, &(u)->c_lflag); \ | ||
| 159 | err |= get_user((k)->c_line, &(u)->c_line); \ | ||
| 160 | err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ | ||
| 161 | if((k)->c_lflag & ICANON) { \ | ||
| 162 | err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | ||
| 163 | err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | ||
| 164 | } else { \ | ||
| 165 | err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | ||
| 166 | err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | ||
| 167 | } \ | ||
| 168 | err; \ | ||
| 169 | }) | ||
| 170 | |||
| 171 | #define kernel_termios_to_user_termios_1(u, k) \ | ||
| 172 | ({ \ | ||
| 173 | int err; \ | ||
| 174 | err = put_user((k)->c_iflag, &(u)->c_iflag); \ | ||
| 175 | err |= put_user((k)->c_oflag, &(u)->c_oflag); \ | ||
| 176 | err |= put_user((k)->c_cflag, &(u)->c_cflag); \ | ||
| 177 | err |= put_user((k)->c_lflag, &(u)->c_lflag); \ | ||
| 178 | err |= put_user((k)->c_line, &(u)->c_line); \ | ||
| 179 | err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ | ||
| 180 | if(!((k)->c_lflag & ICANON)) { \ | ||
| 181 | err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ | ||
| 182 | err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ | ||
| 183 | } else { \ | ||
| 184 | err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ | ||
| 185 | err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ | ||
| 186 | } \ | ||
| 145 | err; \ | 187 | err; \ |
| 146 | }) | 188 | }) |
| 147 | 189 | ||
